flutter - 当我们可以在第一行代码中初始化一个变量时,为什么要在 flutter 中使用 initState()

标签 flutter dart stateful statefulwidget

这3段代码有什么区别吗:

首先:当我在 onInit() 中调用我的函数时。

@override
  void onInit() {
    super.onInit();

    fetchProductsFromAPI();
  }

第二:当我在无状态小部件中的构建方法内部调用我的函数时。

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    fetchProductsFromAPI();

    return GetMaterialApp(
      home: ShoppingPage(),
    );
  }
}

第三:当我在无状态小部件中的构建方法之外调用我的函数时。

    class MyApp extends StatelessWidget {

  fetchProductsFromAPI();

  @override
  Widget build(BuildContext context) {

    return GetMaterialApp(
      home: ShoppingPage(),
    );
  }
}

最佳答案

是的,有区别。您可以阅读 flutter widget 生命周期以了解更多详细信息:

总结

当您在构建方法之外调用方法时(您的第三个示例)。

这是在您可以做到的情况下通常推荐的做法。

参见is there any difference between assigning value to the variable inside of initState or not in Flutter StatefulWidget?

这只会在创建类时运行一次。

initState 内部(您的第一个示例)

此时,您的小部件正在创建。一些 getter 已经可用,例如 context。该方法仅被调用一次。

build 方法中(您的第二个示例)

这通常是最糟糕的方法。 每个构建都会调用您的方法(您可以考虑 1 个构建 = 1 帧),这可能会导致性能不佳。建议尽可能将这些调用移出 build 方法(如果有意义的话)

参见How to deal with unwanted widget build?

关于flutter - 当我们可以在第一行代码中初始化一个变量时,为什么要在 flutter 中使用 initState(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74190396/

相关文章:

json - Flutter - 解析 Json 的最佳方法是什么?

Flutter:替换 '.jpg' 之后的特定字符串

dart - 来自redstone_mapper的关于Web应用程序中可观察对象的错误解码()错误

python - 没有可用的用户状态上下文谷歌云数据流?

java - Wicket:有状态页面中的无状态 AJAX 行为,无需序列化

android - 如何用文本填充轮子,然后使其旋转(全部在 Flutter 中)?

flutter - Material Widget 有什么用?

flutter - MappedListIterable 不是 SubType

c# - 用于有状态应用程序的 ORM。 EF适合吗?或者任何?

Flutter Textformfield 前缀文本