我如何归档
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?)?”。
您需要添加
tristate: true
才能接受 null。此外,需要更改 update()
方法,因为它在回调时提供可为空的 bool
。
Checkbox(
tristate: true,
value: parentvalue,
onChanged: update,
// onChanged:(value) { update(); },
),
更新方法将是
void update(value) {
parentvalue = value;
setState(() {});
}
Checkbox
的更多信息。
以下是将
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();
});
}
}
三态属性用于将空值传递给复选框作为布尔值的位置 因此,如果您想将 null 值传递给复选框而不显示任何错误,则必须将
true
值设置为名为 tristate
的复选框的属性
像这样
CheckBox(
....
tristate:true,
value:null,
...),
让我们讨论一下空安全是如何工作的。
如果您期望一个值(变量/对象)不应该为空,那么只需将该值设置为空安全即可。在你的情况下
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
来保持零安全性。
你只需要使用 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);
});
}
}
Checkbox 的值必须为空
如果你想当值为空时取消选中复选框,你可以使用它而不是空检查
value: parentvalue??false