![](/img/trans.png)
[英]The argument type 'Widget Function(BuildContext, Object?)' can't be assigned to the parameter type 'Widget Function(BuildContext, dynamic, VxStatus?
[英]The argument type 'Widget Function(BuildContext)' can't be assigned to the parameter type 'Widget Function(BuildContext, Widget)'?
我正在尝试为 flutter 中创建的问答游戏实现以下代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:widget_quiz/model/model.dart';
import 'package:widget_quiz/pages/quiz_page/selections.dart';
import 'model.dart';
import 'progress.dart';
import 'question.dart';
import 'result_presenter.dart';
class QuizPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => Model(
quizLoader: Provider.of<QuizLoader>(context, listen: false),
),
create: (BuildContext context) { },
child: const _Page(),
);
}
}
class _Page extends StatefulWidget {
const _Page({Key key}) : super(key: key);
@override
__PageState createState() => __PageState();
}
class __PageState extends State<_Page> {
Model get _model => Provider.of<Model>(context, listen: false);
final _resultPresenter = ResultPresenter();
static const double _horizontalMargin = 16;
@override
void initState() {
super.initState();
_model.answered.listen((correct) async {
await _resultPresenter.show(context, model: _model, correct: correct);
_model.next();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Widget Quiz'),
),
body: _buildBody(),
);
}
Widget _buildBody() {
final model = Provider.of<Model>(context);
return SafeArea(
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 200),
child: model.quizListLoaded
? model.hasQuiz ? _buildQuiz() : _buildResult()
: const Center(child: CircularProgressIndicator()),
),
);
}
Widget _buildQuiz() {
return Column(
children: const [
Progress(),
Divider(
indent: _horizontalMargin,
endIndent: _horizontalMargin,
height: 0,
),
Expanded(
child: SingleChildScrollView(
padding: EdgeInsets.all(_horizontalMargin),
physics: AlwaysScrollableScrollPhysics(),
child: Question(),
),
),
Padding(
child: Selections(),
padding: EdgeInsets.symmetric(horizontal: _horizontalMargin),
),
],
);
}
Widget _buildResult() {
final model = Provider.of<Model>(context);
// model
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'⭕️ ${model.progress.where((p) => p == ProgressKind.correct).length} / 10',
style: const TextStyle(fontSize: 32),
),
const SizedBox(height: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: model.progress
.asMap()
.map((index, p) => MapEntry(
index,
Text(
'${p == ProgressKind.correct ? '⭕️' : '❌'} ${model.quizList[index].correct.name}')))
.values
.toList(),
),
const SizedBox(height: 8),
RaisedButton(
child: const Text('TRY AGAIN'),
onPressed: model.load,
)
],
),
);
}
}
但是我收到以下错误
1/ 错误:返回类型“Model”不是闭包上下文所要求的“Widget”。 (return_of_invalid_type_from_closure 在 [widget_quiz] lib\pages\quiz_page\quiz_page.dart:15)
2/错误:无法将参数类型“Widget Function(BuildContext)”分配给参数类型“Widget Function(BuildContext, Widget)”。 (argument_type_not_assignable 在 [widget_quiz] lib\pages\quiz_page\quiz_page.dart:15)
解决办法是什么?
首要问题
ChangeNotifierProvider
中的参数构建器需要一个类型为 function 的小部件
Widget Function(BuildContext context, Widget? child)
所以,改变这一行
builder: (context) => Model(
和
builder: (context, child) => Model(
第二期
你只需要在function返回一个child
是一个Widget,所以你可以返回child
或者其他的widget。
builder: (context, child) {
// Your code
return child;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.