StatefulWidget 中的以下 var 初始化位置有啥区别?

Posted

技术标签:

【中文标题】StatefulWidget 中的以下 var 初始化位置有啥区别?【英文标题】:What is the difference between the following var initialization positions in a StatefulWidget?StatefulWidget 中的以下 var 初始化位置有什么区别? 【发布时间】:2022-01-18 14:50:57 【问题描述】:

我想知道在 StatefulWidget 的情况下在哪里声明和初始化变量。似乎有几种方法可以做到这一点,但是否存在差异、任何指导方针或最佳实践方法?

我创建了以下示例,但除了在执行热重载时,variable i 失去其值并再次回到零之外,找不到任何差异。

我读过this,但它包含很多相互矛盾的cmets。

class Sample extends StatefulWidget 
  int i=0;
  late Object object1 = Get.put(Object());
 
  @override
  _SampleState createState() => _SampleState();


class _SampleState extends State<Sample> 
  int j = 0;
  late Object object2;

  @override
  void initState() 
    i=5;
    j=5;
    object1.param="value123";
    object2=Get.put(Object());
    object2.param="value123";
  

  @override
  Widget build(BuildContext context) 

  

【问题讨论】:

【参考方案1】:

首先,如果您在模拟器上运行您的应用程序,您确实不会发现任何差异。但是,这种观察是巨大的误导!

widget 类 中声明的变量是否已在Widget 类不持久widget 重新创建 的情况下。 StatefulWidgets (and all Widget subclasses) are thrown away and rebuilt whenever configuration changes. 幸运的是,您可以通过在测试应用程序时对小部件执行热重载来强制执行小部件重新创建。以确保正确的行为。

如果你想声明应该持久化的变量(状态数据),请确保将它们放在 State 类中,如上述代码示例中的 int j。 对于无法在声明语句中初始化的变量,请使用 initState()

为什么object1保留它的数据?

很简单,因为 GetX 不会重新创建 Object 的新实例(如果已经存在)。每次重建 Widget 时,它都会返回旧实例。这就是为什么 object1 和 object2 的声明位置没有区别的原因。

在编写此答案时,如果您不使用绑定,则必须手动调用 Get.delete() 以释放控制器。

【讨论】:

以上是关于StatefulWidget 中的以下 var 初始化位置有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Flutter 中的其他 StatefulWidget 设置/更新 StatefulWidget 的状态?

Flutter 中的 statefulWidget 中的屏幕未更新

如何从 StatelessWidget 中的 StatefulWidget 访问变量?

C++指针初学习

如何在 Flutter 的 StatefulWidget 类中的 setState() 方法上停止小部件重新加载

js学习(初)