在小部件构建完成之前运行方法?

Posted

技术标签:

【中文标题】在小部件构建完成之前运行方法?【英文标题】:Run a method before the widget build complete? 【发布时间】:2021-05-09 00:07:27 【问题描述】:

我想知道是否有任何方法可以仅在应用程序启动时调用函数,但在构建小部件之前。我只想在应用程序启动时从 JSON 中获取数据。但是方法在提供者中并且需要上下文。

我尝试了几种方法,但没有什么是完美的。我在 HomeScreen() 的 initState 上调用了该函数,但仍需要刷新应用程序才能看到。 (因为该方法是在布局构建后调用的..所以没有加载任何项目)

void initState() 
super.initState();

Provider.of<Utils>(context, listen: false)
    .fetchDataFromJSON()
    .then((value) 
  setState(() );
);

仍然需要刷新或更改页面来加载项目。我在 tabScreen.dart 中执行此 initState。显然,在 HomeScreen 上创建元素所需的数据但第一次没有加载。

编辑:我通过更改调用函数的位置来修复它。我的错误是我从 TabScreen 的 InitState 中调用了初始状态。我将其更改为 HomeScreen 的 InitState,它运行良好。希望我的错误对其他人有所帮助。

【问题讨论】:

在获取后调用notifyListeners(),因为函数在Provider中。或者在initState 你可以做fetchData().then( (_) =&gt; setState(() ) ); 【参考方案1】:

方法一(不确定) 您可以在 main 方法中使用您的方法,然后运行应用程序。

但如果这会导致 lateInit 错误,我现在不会。

void main() 
   someFunction.then((value) 
      runApp(MyApp);
    )

方法二

创建布尔变量,如 loaded 将其设置为 false

然后使用三元运算符分配您的小部件需要的数据。

如果loaded 为假,则加载另一个小部件而不是需要数据的小部件

函数完成后在 initState 中使用函数,将 loaded 设置为 true

【讨论】:

我已经尝试过了,所以我们只能运行一次获取代码。但问题是获取工作正常,但我需要刷新或更改页面以显示数据。我不知道为什么。运行应用程序之前的代码是无助的,因为我需要上下文因为使用 Provider。

以上是关于在小部件构建完成之前运行方法?的主要内容,如果未能解决你的问题,请参考以下文章

在小部件构建期间如何在颤动中导航?

jQuery UI - 我啥时候应该在小部件上使用 destroy 方法

除了 setstate 颤振之外,如何在小部件构建中获取值

在小部件中打开一个活动

ValueNotifier:在页面构建完成之前更新小部件的文本引发异常

ScaffoldMessenger.of(context).showSnackBar() 在小部件构建函数中直接调用时不起作用