dart 类型"函数“不是类型”函数“的子类型

u59ebvdq  于 2023-11-14  发布在  其他
关注(0)|答案(3)|浏览(110)

我是Flutter的新手。我正在构建一个测验应用程序,并有以下三个dart文件:

主.dart

import 'package:flutter/material.dart';
import './answer.dart';
import './question.dart';

void main(){
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  State<StatefulWidget> createState(){
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp>{
  var _questionIndex = 0;
  _answerQuestion(){
    setState(() {
      _questionIndex = _questionIndex + 1;
    });
}
  @override
  Widget build(BuildContext context) {
    var questions = [
      {'questionText': 'What\'s your favourite color ?',
        'answers': ['Red','Blue','White','Black']
      },
      {'questionText': 'What\'s your favourite Animal ?',
        'answers': ['Dog','Rabbit','Tiger','Monkey']
      },
      {'questionText': 'What\'s your favourite Day ?',
        'answers': ['Tuesday','Monday','Sunday','Friday','Wednesday','Saturday']
      },
    ];
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('My First App'),
        ),
        body: Column(
          children: [
            Question(questions[_questionIndex]['questionText'] as String,
            ),
            ...(questions[_questionIndex]['answers'] as List).map((answer) {
              return Answer(_answerQuestion(),answer);
            }).toList()
    ],
        )
      ),
    );
  }
}

字符串

**问题. dart **

import 'package:flutter/material.dart';

class Question extends StatelessWidget {
  final String questions;
  Question(this.questions);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      margin: EdgeInsets.all(10),
      child:(
      Text(
      questions,
      style: TextStyle(
          fontSize: 25),
      textAlign: TextAlign.center,)
    ),
    );
  }
}

**答案. dart **

import 'package:flutter/material.dart';

class Answer  extends StatelessWidget {
  final Function buttonHandler;
  final String answer;

  Answer(this.buttonHandler,this.answer);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      child: ElevatedButton(
        child: Text(answer),
        style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.blue),
            foregroundColor: MaterialStateProperty.all(Colors.white)
        ),
        onPressed: () => buttonHandler,
    ),
    );
  }
}


当我在Android Studio中运行我的Android应用程序时,我得到这个错误:
由WIDGETS LIBRARY提供的电子邮件例外情况
构建MyApp(dirty,state:_MyAppState#7f7de)时抛出以下_TypeError:
类型"函数“不是类型”函数“的子类型
导致错误的相关小部件是:
MyApp文件:/C:/src/first_app/lib/main. dart:7:10

jdzmm42g

jdzmm42g1#

这一点:

onPressed: () => buttonHandler,

字符串
必须是:

onPressed: buttonHandler,


onPressed: () => buttonHandler(),


这取决于您的处理程序是否与所需的签名完全匹配。
此外,这:

return Answer(_answerQuestion(),answer);


需要

return Answer(_answerQuestion,answer);


一般来说,你已经把 * 调用 * 一个方法和 * 传递 * 一个方法作为一个参数混淆了几次,你可能想更熟悉它。

h9a6wy2h

h9a6wy2h2#

首先,你必须传递一个函数结构,而不是通过调用它来返回函数的值。
你在下面声明了这个函数:

_answerQuestion(){
    setState(() {
      _questionIndex = _questionIndex + 1;
    });
}

字符串
并传递了返回值而不是函数结构,如下所示:

return Answer(_answerQuestion(),answer);


正如你所看到的,_answerQuestion()的返回值是。

return Answer(_answerQuestion,answer);


你需要调用Answer组件中的函数。

onPressed: buttonHandler


onPressed: () => buttonHandler()

vptzau2j

vptzau2j3#

你的代码工作正常尝试flutter clean

相关问题