在构建之前使用 initState 从函数中获取值并插入到变量中

Posted

技术标签:

【中文标题】在构建之前使用 initState 从函数中获取值并插入到变量中【英文标题】:Using initState to get values from functions and insert into variable before Build 【发布时间】:2021-04-26 09:25:45 【问题描述】:

我有两个函数试图从中获取值,并将其存储到 main_page 中的变量中,以便我可以在构建小部件中使用。我正在使用 firebase 实时数据库。我拥有的功能是:

Future<List> receive_button(String button) async
    List<String> lst = new List<String>(2);

    final FirebaseUser user = await _auth.currentUser();
    var snapshot = await databaseReference.child(user.uid+"/buttons/"+button+"/icon").once();
    String result = snapshot.value;

    var snapshot1 = await databaseReference.child(user.uid+"/buttons/"+button+"/nome").once();
    String result1 = snapshot1.value;
    
    lst[0] = result;
    lst[1] = result1;

    print(lst);
    return lst;
  

  Future<int>  receive_quantity() async
    final FirebaseUser user = await _auth.currentUser();
    var snapshot = await databaseReference.child(user.uid+"/buttons/quantity").once();
    var result = snapshot.value;
    print(result);
    return result;
  

这就是我尝试将数据存储在 home_page 的变量中的方式:

class _HomeState extends State<Home> 

  int quantity = 0;
  List<String> lst = new List<String>(2);

  final AuthService _auth = AuthService();
  
  @override
  void initState() 
    super.initState();
    _auth.receive_quantity().then((value) => quantity = value);
    _auth.receive_button("button1").then((value) => lst = value);
  

但每当我尝试在 Widget 构建中打印值时,我都会得到以下信息:

flutter: 0
flutter: [null, null]

在我的数据库中这个flutter: 0,实际值为2。 而这个flutter: [null, null]has ["add", "Chocolate"] 我已经测试了函数本身,它为我提供了正确的数据,但我在仅存储它们时遇到了问题。

【问题讨论】:

【参考方案1】:

试试这个,因为我知道你不能在覆盖方法initState() 中使用等待,所以这是我通常做的,它工作正常

@override
  void initState() 
    super.initState();
    asyncInit();
  

void asyncInit() async 
   quantity = await _auth.receive_quantity();
   lst = await _auth.receive_button("button1");
   setState(() );

【讨论】:

但是你需要调用 setState 因为这些是局部变量,我已经编辑了 asyncInit()。 这实际上工作得很好,你能看看这篇文章并尝试帮助我吗:***.com/questions/65819570/…【参考方案2】:

你可以使用futurebuilder

FutureBuilder(
  future: Future.wait([receive_button, receive_quantity]), //Init receive_button/quantity in initState
  builder: (context, AsyncSnapshot<List<dynamic>> snapshot) 
    if (snapshot.hasData)  //Wait for futures to finish
        int quantity = snapshot.data[1];
        List<String> lst = snapshot.data[0];
        return Container(...);
    else 
        return Text("Waiting for datas...");
    
  ,
);

【讨论】:

以上是关于在构建之前使用 initState 从函数中获取值并插入到变量中的主要内容,如果未能解决你的问题,请参考以下文章

在颤振中在 initstate() 之前调用了dependOnInheritedElement()

从 blocbuilder 接收值的 initstate 中的 BlocProvider

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

将文档中的值从数据库保存到 initState 值的颤振问题

有没有办法在 InitState 方法上加载异步数据?

Flutter 在 initState 方法中获取上下文