颤动中的空安全

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();
  }