错误:参数类型“void Function(bool)”无法分配给参数类型“void Function(bool?)”

del*_*ram 9 dart flutter

问题是标题。我正在尝试构建 todoye 应用程序,正如您所看到的,回调被认为是 ValueChanged<bool?> 不是一个简单的函数,所以我无法将我的逻辑移动到另一个 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,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 13

我遇到了同样的问题,最终我成功了

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,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样改变这个函数

void checkboxCallBack(bool? checkboxState) {
    setState(() {
      isChecked = checkboxState ?? true;
    });
  }
Run Code Online (Sandbox Code Playgroud)

并将 Checkbox 变量切换为:

final Function(bool?) toggleCheckboxState;
Run Code Online (Sandbox Code Playgroud)


quo*_*oci 7

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

void checkBoxCallBack(bool? checkBoxState) {
    if (checkBoxState != null) {
      setState(() {
        isChecked = checkBoxState;
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)