Flutter:复选框 Tristate 不适用于空安全

问题描述 投票:0回答:6

我如何归档

tristate
用于具有nullsafety的复选框......我必须将null传递到该值中,但nullsafety必须对变量执行null检查,这只是矛盾......

照常进行空检查:

                 bool? parentvalue;

                 void update() {
                     parentvalue = null;
                  }


                 Checkbox(
                      ....
                      value: parentvalue!,
                  onChanged: update(),
                      ....
                    ),

错误:对空值使用空检查运算符

如果我删除空检查,代码根本无法编译

                  bool parentvalue;

                  void update() {
                    parentvalue = null;
                    }


                  Checkbox(
                      ....
                      value: parentvalue,
                      onChanged: update(),
                      ....
                    ),

错误:“Null”类型的值无法分配给“bool”类型的变量。

====================================================== =============== 更新:

Checkbox(
          tristate: true,
          checkColor: Colors.white,
          fillColor: MaterialStateProperty.resolveWith(getColor),
          value: isChecked,
          onChanged: (bool? value) {
            setState(() {
              isChecked = value!;
            });
          },
        ),

错误:对空值使用空检查运算符

如果我删除空检查

onChanged: (bool value) {
                setState(() {
                  isChecked = value;
                });
              },

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

flutter checkbox dart-null-safety
6个回答
0
投票

您需要添加

tristate: true
才能接受 null。此外,需要更改
update()
方法,因为它在回调时提供可为空的
bool

Checkbox(
  tristate: true,
  value: parentvalue,
  onChanged: update,
  // onChanged:(value) { update(); },
),

更新方法将是

 void update(value) {
    parentvalue = value;
    setState(() {});
  }

有关 flutter.dev 上的

Checkbox
的更多信息。


0
投票

以下是将

tristate
设置为
true
的示例:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Row(
          children: [
            MyCheckbox(),
          ],
        ),
      ),
    );
  }
}

class MyCheckbox extends StatefulWidget {
  const MyCheckbox({Key? key}) : super(key: key);

  @override
  State<MyCheckbox> createState() => _MyCheckboxState();
}

class _MyCheckboxState extends State<MyCheckbox> {
  bool? parentValue;
  void update() {
    setState(() {
      parentValue = null;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Checkbox(
        tristate: true,
        value: parentValue,
        onChanged: (_) {
          update();
        });
  }
}

0
投票

三态属性用于将空值传递给复选框作为布尔值的位置 因此,如果您想将 null 值传递给复选框而不显示任何错误,则必须将

true
值设置为名为
tristate
的复选框的属性 像这样

CheckBox(
....
tristate:true,
value:null,
...),

0
投票

让我们讨论一下空安全是如何工作的。

如果您期望一个值(变量/对象)不应该为空,那么只需将该值设置为空安全即可。在你的情况下

bool? parentvalue
.

& 如果您阅读了 Checkbox 属性

/// This property must not be null.
  final bool? value;


/// If tristate is false (the default), [value] must not be null.
  final bool tristate;

这里的值是空安全的,你不能为其分配空值。

因此,如果您将父值指定为 null,则复选框 value 属性将不会接受该值。仅限布尔值(真/假)除外。

 void update() {
    //Wrong
    parentvalue = null;
  }

因此,您应该根据要求将您的父值设置为默认 true 或 false。或者您也可以使用

value: parentvalue??false/true
来保持零安全性。


0
投票

你只需要使用 var 而不是 bool 吗?您将获得复选框的所有三种状态,即 true、false 和 null。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Row(
          children: [
            MyCheckbox(),
          ],
        ),
      ),
    );
  }
}

class MyCheckbox extends StatefulWidget {
  const MyCheckbox({Key? key}) : super(key: key);

  @override
  State<MyCheckbox> createState() => _MyCheckboxState();
}

class _MyCheckboxState extends State<MyCheckbox> {
  var parentValue;
  void update(var value) {
    setState(() {
      parentValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Checkbox(
        tristate: true,
        value: parentValue,
        onChanged: (value) {
          update(value);
        });
  }
}

-1
投票

Checkbox 的值必须为空
如果你想当值为空时取消选中复选框,你可以使用它而不是空检查

value: parentvalue??false
© www.soinside.com 2019 - 2024. All rights reserved.