颤动中的空安全
null safety in flutter
如何在 class 中声明字段并在 initState() 函数中对其进行初始化。
我尝试了两种解决方案,仍然没有用。
首先:声明字段并在 initeState 内部初始化仍然无法正常工作。
第二:用 (?) 操作声明字段,但如果我像在处理函数 tabController.dispose();
中那样使用字段,仍然会给我错误
class _TabBarInsideAppBarDemoState extends State<TabBarInsideAppBarDemo>
{
TabController tabController; // **first:** error :on-nullable instance field 'tabController' must be initialized.
//**second** TabController? tabController ; this also give me error in dispose function it says : The method 'dispose' can't be unconditionally invoked because the receiver can be 'null'.
@override
void initState() {
super.initState();
tabController = TabController(length: 3, vsync: this);
}
@override
void dispose() {
tabController.dispose();
super.dispose();
}
Widget getTabBar() {
return TabBar(controller: tabController, tabs: [
Tab(text: "Add", icon: Icon(Icons.add)),
Tab(text: "Edit", icon: Icon(Icons.edit)),
Tab(text: "Delete", icon: Icon(Icons.delete)),
]);
}
Widget getTabBarPages() {
return TabBarView(controller: tabController, children: <Widget>[
Container(color: Colors.red),
Container(color: Colors.green),
Container(color: Colors.blue)
]);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
flexibleSpace: SafeArea(
child: getTabBar(),
),
),
body: getTabBarPages());
}
}
在 flutter 2 中你需要指定一个参数是否可以为 nullable 或 non-nullable object 如果它是 nullable 你需要在数据类型旁边添加 ?
like
TabController? tabController;
但是如果你想延迟声明,那么你可以使用 late
关键字。
late TabController tabController;
这告诉编译器它不是 null 只是我们稍后要赋值。就像您在 initState 中分配它一样。
确保在访问之前分配值,否则会抛出异常。
代码:
late TabController tabController;
@override
void initState() {
super.initState();
tabController = TabController(length: 3, vsync: this);
}
@override
void dispose() {
tabController.dispose();
super.dispose();
}
如何在 class 中声明字段并在 initState() 函数中对其进行初始化。 我尝试了两种解决方案,仍然没有用。 首先:声明字段并在 initeState 内部初始化仍然无法正常工作。 第二:用 (?) 操作声明字段,但如果我像在处理函数 tabController.dispose();
中那样使用字段,仍然会给我错误class _TabBarInsideAppBarDemoState extends State<TabBarInsideAppBarDemo>
{
TabController tabController; // **first:** error :on-nullable instance field 'tabController' must be initialized.
//**second** TabController? tabController ; this also give me error in dispose function it says : The method 'dispose' can't be unconditionally invoked because the receiver can be 'null'.
@override
void initState() {
super.initState();
tabController = TabController(length: 3, vsync: this);
}
@override
void dispose() {
tabController.dispose();
super.dispose();
}
Widget getTabBar() {
return TabBar(controller: tabController, tabs: [
Tab(text: "Add", icon: Icon(Icons.add)),
Tab(text: "Edit", icon: Icon(Icons.edit)),
Tab(text: "Delete", icon: Icon(Icons.delete)),
]);
}
Widget getTabBarPages() {
return TabBarView(controller: tabController, children: <Widget>[
Container(color: Colors.red),
Container(color: Colors.green),
Container(color: Colors.blue)
]);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
flexibleSpace: SafeArea(
child: getTabBar(),
),
),
body: getTabBarPages());
}
}
在 flutter 2 中你需要指定一个参数是否可以为 nullable 或 non-nullable object 如果它是 nullable 你需要在数据类型旁边添加 ?
like
TabController? tabController;
但是如果你想延迟声明,那么你可以使用 late
关键字。
late TabController tabController;
这告诉编译器它不是 null 只是我们稍后要赋值。就像您在 initState 中分配它一样。
确保在访问之前分配值,否则会抛出异常。
代码:
late TabController tabController;
@override
void initState() {
super.initState();
tabController = TabController(length: 3, vsync: this);
}
@override
void dispose() {
tabController.dispose();
super.dispose();
}