【问题标题】:error: The argument type 'void Function(bool)' can't be assigned to the parameter type 'void Function(bool?)'错误:无法将参数类型“void Function(bool)”分配给参数类型“void Function(bool?)”
【发布时间】:2021-09-01 07:12:46
【问题描述】:

问题是标题。我正在尝试构建 todoye 应用程序,正如您所看到的,回调被认为是 ValueChanged 不是一个简单的函数,所以我无法将我的逻辑移动到另一个 statefullwidget 以减少我的应用程序中的重建我尝试了不同的事情但我得到了每次出错请帮忙。 这是我的代码:

import 'package:flutter/material.dart';

class TaskTile extends StatefulWidget {
  @override
  _TaskTileState createState() => _TaskTileState();
}

class _TaskTileState extends State<TaskTile> {
  bool isChecked = false;
  void checkBoxCallBack(bool checkBoxState) {
    setState(() {
      isChecked = checkBoxState;
    });
  }

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Text(
        'finish up angla\'s course today',
        style: TextStyle(
          decoration: isChecked ? TextDecoration.lineThrough : null,
        ),
      ),
      trailing: TaskCheckBox(
        checkBoxState: isChecked,
        toggleCheckBoxState: checkBoxCallBack,
      ),
    );
  }
}

class TaskCheckBox extends StatelessWidget {
  final bool checkBoxState;
  final ValueChanged<bool?> toggleCheckBoxState;

  const TaskCheckBox({
    required this.checkBoxState,
    required this.toggleCheckBoxState,
  });

  @override
  Widget build(BuildContext context) {
    return Checkbox(
      activeColor: Colors.lime,
      value: checkBoxState,
      onChanged: toggleCheckBoxState,
    );
  }
}

错误在第 27 行...我想将我的自定义函数传递给我的 statelessWidget 变量。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    发生这种情况是因为您已将toggleCheckBoxState 声明为final ValueChanged&lt;bool?&gt; toggleCheckBoxState;,并且bool 数据类型与bool? 数据类型不同。 bool? 是一个可为空的布尔类型。要修复它,请将方法 checkBoxCallback 更改为以下

    void checkBoxCallBack(bool? checkBoxState) {
        if (checkBoxState != null) {
          setState(() {
            isChecked = checkBoxState;
          });
        }
      }
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,最终我得到了这个工作

      import 'package:flutter/material.dart';
      
      class TaskTile extends StatefulWidget {
        @override
        _TaskTileState createState() => _TaskTileState();
      }
      
      class _TaskTileState extends State<TaskTile> {
        bool isChecked = false;
      
        void checkboxCallBack(bool? checkboxState) {
          setState(() {
            isChecked = checkboxState ?? true;
          });
        }
      
        @override
        Widget build(BuildContext context) {
          return ListTile(
            title: Text(
              'Task 1',
              style: TextStyle(
                  decoration:
                      isChecked ? TextDecoration.lineThrough : TextDecoration.none),
            ),
            trailing: TaskCheckbox(isChecked, checkboxCallBack),
          );
        }
      }
      
      class TaskCheckbox extends StatelessWidget {
        final bool checkboxState;
        final Function(bool?) toggleCheckboxState;
      
        TaskCheckbox(this.checkboxState, this.toggleCheckboxState);
      
        @override
        Widget build(BuildContext context) {
          return Checkbox(
            activeColor: Colors.lightBlueAccent,
            value: checkboxState,
            onChanged: toggleCheckboxState,
          );
        }
      }
      

      像这样改变这个函数

      void checkboxCallBack(bool? checkboxState) {
          setState(() {
            isChecked = checkboxState ?? true;
          });
        }
      

      和toggleCheckbox变量:

      final Function(bool?) toggleCheckboxState;
      

      【讨论】:

      • 天哪,我希望她能更新她的课程。我被困在同一个地方,这解决了我的问题。谢谢。
      【解决方案3】:

      我也遇到过同样的问题,当我尝试更新方法时checkboxCallback

      到这里:

      void checkBoxCallBack(bool? checkBoxState) {
          if (checkBoxState != null) {
            setState(() {
              isChecked = checkBoxState;
            });
          }
        }
      

      我仍然收到错误,但是当我尝试更新 CheckboxonChanged:property 时

      进入这个:

      onChanged: toggleCheckboxState as void Function(bool?)?,
      

      我不知道为什么或如何,但它可以完成工作。

      更新代码:

      import 'package:flutter/material.dart';
      
      class TaskTile extends StatefulWidget {
        @override
        _TaskTileState createState() => _TaskTileState();
      }
      
      class _TaskTileState extends State<TaskTile> {
        bool isChecked = false;
      
        void checkBoxCallBack(bool? checkBoxState) {
          if (checkBoxState != null) {
            setState(() {
              isChecked = checkBoxState;
            });
          }
        }
      
        @override
        Widget build(BuildContext context) {
          return ListTile(
            title: Text(
              'this is a sample task',
              style: TextStyle(
                  decoration: isChecked ? TextDecoration.lineThrough : null),
            ),
            trailing: TaskCheckbox(
              checkboxState: isChecked,
              toggleCheckboxState: checkBoxCallBack,
            ),
          );
        }
      }
      
      class TaskCheckbox extends StatelessWidget {
        final bool checkboxState;
        final Function toggleCheckboxState;
      
        TaskCheckbox(
            {required this.checkboxState, required this.toggleCheckboxState});
      
        @override
        Widget build(BuildContext context) {
          return Checkbox(
            activeColor: Colors.lightBlueAccent,
            value: checkboxState,
            onChanged: toggleCheckboxState as void Function(bool?)?,
          );
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-01
        • 2022-01-17
        • 2021-08-11
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        相关资源
        最近更新 更多