在 Flutter 中从 main() 调用 setState()

Posted

技术标签:

【中文标题】在 Flutter 中从 main() 调用 setState()【英文标题】:Call setState() from main() in Flutter 【发布时间】:2021-02-09 15:48:30 【问题描述】:

我在 main() 中调用的每个 Cron-Job 之后如何调用特定 State-Class 的 setState() 方法?

主要():

void main() async 
    new Cron().schedule(new Schedule.parse('* * * * *'), () async 
        uploadDocuments();
    );

    runApp(MaterialApp(
        home: MainMenu(),
    ));

类,我想要调用 setState() 的地方:

class DbObjectsDetails extends StatefulWidget 

    @override
    _DbObjectsDetailsState createState() => _DbObjectsDetailsState();


class _DbObjectsDetailsState extends State<DbObjectsDetails> 

    void initState() 
        loadFilesFromDatabase(true);
    

【问题讨论】:

我不会直接设置状态。您可以设置一个ChangeNotifier,在其上调用一个方法,然后通知听众。在您的 Widget 中,收听它并设置您收到通知时的状态。 或者使用 RiverPod。在那里更新一个值并在它发生变化时重建它是微不足道的。 【参考方案1】:

可以尝试使用get_it包注册GlobalKey的单例,然后在两个地方都使用

此代码可能有效:

import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';

GetIt locator = GetIt.instance..allowReassignment = true;

void setupLocator() 
  locator.registerLazySingleton(() => GlobalKey<DbObjectsDetailsState>());


GlobalKey<DbObjectsDetailsState> newWidgetKey() 
  locator.registerSingleton(GlobalKey<DbObjectsDetailsState>());
  return locator<GlobalKey<DbObjectsDetailsState>>();


void main() async 
  setupLocator()
  new Cron().schedule(new Schedule.parse('* * * * *'), () async 
    //you can acces the current state of the widget like that:
    locator<GlobalKey<DbObjectsDetailsState>>().currentState?.rebuild(););
    
      runApp(MaterialApp(
        home: DbObjectsDetails(key: newWidgetKey()),
      ));
    
    
    class DbObjectsDetails extends StatefulWidget 
      DbObjectsDetails(Key key) : super(key: key);
      @override
      DbObjectsDetailsState createState() => DbObjectsDetailsState();
    
    
    class DbObjectsDetailsState extends State<DbObjectsDetails> 
      @override
      Widget build(BuildContext context) 
        throw UnimplementedError();
      
    
      void rebuild() => setState(())

【讨论】:

【参考方案2】:

您只能在有状态小部件中使用状态。主要功能不是小部件,而是飞镖功能。所以没有办法在主函数中使用 setState() 函数。

【讨论】:

以上是关于在 Flutter 中从 main() 调用 setState()的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从streambuilder导航到其他页面?

在 Flutter Web 中从 JS 调用 Dart 方法

调用 if __name__ == '__main__':在一个模块中从另一个模块中的函数 [关闭]

在 Flutter 中从 Firebase 读取数组 [重复]

在 ghci 中从 c 源调用动态库失败

在 Swift 中从字符串调用方法