Flutter ToDo 列表复选框无法分配布尔值

Posted

技术标签:

【中文标题】Flutter ToDo 列表复选框无法分配布尔值【英文标题】:Flutter ToDo list checkbox cant assign bool 【发布时间】:2021-11-23 11:19:02 【问题描述】:

我正在尝试用颤振开发一个 ToDo 列表。

我正在为列表运行一个有状态的小部件,其状态的构建方法如下所示:

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: const Text('ToDo App'),
        backgroundColor: const Color.fromRGBO(35, 0, 0, 100),
      ),
      body: ListView.builder(
          itemCount: products.length,
          itemBuilder: (context, index) 
            String key = products.keys.elementAt(index);
            return ToDoListEntry(
                key, products[key], () => deleteItem(key), () => check(key));
          ),
      floatingActionButton: FloatingActionButton(
        onPressed: newEntry,
        child: const Icon(Icons.arrow_downward),
      ),
    );
  

一个函数 addItem(String item) 正在工作,还有一个函数 deleteItem(String key),我传递给 ToDoListEntry 类正在工作。 现在我尝试为 Checkbox 编写更新功能并将我的条目保存到 Map 产品中:

Map<String, bool> products = 
    'Kartoffel': false,
    'Tomate': false,
    'Käse': false,
    'Wurst': false
  ;

当我现在将 products[key] 传递给我的 ToDoListEntry 小部件时,它说:“参数类型'bool?'不能赋值给参数类型'bool'"

什么是“布尔”?我找不到任何解释。

ToDoListEmtry 看起来像这样:

class ToDoListEntry extends StatelessWidget 
  final String title;
  bool state;
  final Function remove, check;
  ToDoListEntry(this.title, this.state, this.remove, this.check);

  @override
  Widget build(BuildContext context) 
    return Container(
      padding: EdgeInsets.symmetric(horizontal: 22),
      child: ListTile(
        contentPadding: EdgeInsets.symmetric(vertical: 8.0),
        leading: Checkbox(
          value: state,
          onChanged: (bool value) => check(),
        ),
        title: Text(
          title,
          style: TextStyle(fontSize: 18, color: Colors.black54),
        ),
        trailing: IconButton(
          icon: Icon(Icons.delete_outline),
          onPressed: () => remove(),
        ),
      ),
    );
  

这里我遇到了 Checkbox 中的 onChecked 方法的问题:“参数类型 'void Function(bool)' 不能分配给参数类型 'void'”

【问题讨论】:

您可以通过添加 onChanged: (bool? value) =&gt; check(), 来使这个 Null 安全。 我已经尝试过了,将布尔列表更改为“布尔?”,但随后该功能不起作用。我需要以某种方式弄清楚,“布尔”如何?工作。 事情是bool? 的意思是字面意思bool or null。而bool 表示bool and nothing else。调用someMap[someKey] 会返回bool?,因为该索引处可能没有元素。如果您确定它存在,请使用 bang 运算符 (!)。我想你需要先阅读关于 null 安全性的内容。 【参考方案1】:

对映射条目products[key] 的引用必须以!运算符,以保证它不会为空。

return ToDoListEntry(
  key, products[key]!, () => deleteItem(key), () => check(key));
),

由于某种原因,我的 Checkbox 的 onChanged 方法必须是 nullsafe。错误并没有指出这一点。

leading: Checkbox(
          value: state,
          onChanged: (bool? value) => check(),
        ),

【讨论】:

以上是关于Flutter ToDo 列表复选框无法分配布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 无法获取 ontap 函数来更改布尔列表

如何使用 SharedPreferences 从 Flutter 中的列表中保存多个布尔值

无法在 Getx Flutter 中获取布尔值

基于存储过程中的非布尔值检查网格视图中的复选框

在列表视图多选中设置状态后,颤振布尔值重置

为啥我无法将程序中找到的布尔结果的正确值分配给布尔变量并使用结果检查条件?