Flutter:Checkbox Tristate won't work on Android Safety

ycl3bljg  于 2023-10-22  发布在  Flutter
关注(0)|答案(6)|浏览(154)

如何将tristate存档为具有nullsafety的复选框。我必须将null传入该值,但nullsafety必须对变量执行null检查,这只是矛盾的。
像往常一样进行null检查:

bool? parentvalue;

                 void update() {
                     parentvalue = null;
                  }

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

错误:对空值使用了校验运算符
如果删除空检查,代码根本无法编译

bool parentvalue;

                  void update() {
                    parentvalue = null;
                    }

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

错误:无法将类型为“”的值赋给类型为“”的变量。

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?)?'.

vjrehmav

vjrehmav1#

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

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

和更新方法将是

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

关于Checkbox的更多信息,请访问flutter.dev。

v2g6jxz6

v2g6jxz62#

下面是将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();
        });
  }
}
bhmjp9jg

bhmjp9jg3#

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

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

6jjcrrmo4#

让我们来讨论一下网络安全是如何工作的。
如果你期望一个不应该为null的值(变量/对象),那么简单地将该值设置为null安全。在你的情况下bool? parentvalue
如果读取Checkbox属性(& F)

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

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

这里value是null安全性,你不能给它赋null值。
因此,如果您将parentvalue赋值为null,则Checkboxvalue属性将不接受此值。除了布尔值(true/false)。

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

因此,你应该根据需要将parentvalue设置为true或false。或者你也可以使用value: parentvalue??false/true来维护null安全。

jckbn6z7

jckbn6z75#

你只需要使用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);
        });
  }
}
ulmd4ohb

ulmd4ohb6#

Checkbox的值必须为nut null
如果您希望在值为空时取消复选框,则可以使用此选项而不是空检查

value: parentvalue??false

相关问题