繁体   English   中英

无法将参数类型“Widget Function(BuildContext)”分配给参数类型“Widget Function(BuildContext, Widget)”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM