Flutter 使用initState从函数中获取值并在生成之前插入变量

Flutter 使用initState从函数中获取值并在生成之前插入变量,flutter,dart,firebase-realtime-database,flutter-layout,flutter-dependencies,Flutter,Dart,Firebase Realtime Database,Flutter Layout,Flutter Dependencies,我有两个函数,我试图从中获取值,并将其存储到主页中的变量中,以便在构建小部件中使用。我正在使用firebase实时数据库。我拥有的功能有: Future<List> receive_button(String button) async{ List<String> lst = new List<String>(2); final FirebaseUser user = await _auth.currentUser(); var sn

我有两个函数,我试图从中获取值,并将其存储到主页中的变量中,以便在构建小部件中使用。我正在使用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;
  }
在我的数据库中,这个
颤振:0
,实际值是2。
这个
flatter:[null,null]
有[“添加”,“巧克力”]

我已经测试了函数本身,它给了我正确的数据,我只在存储它们时遇到问题。

您可以使用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...");
    }
  },
);
FutureBuilder(
future:future.wait([receive\u button,receive\u quantity]),//Init receive\u button/initState中的数量
生成器:(上下文,异步快照){
if(snapshot.hasData){//等待期货完成
int数量=快照数据[1];
List lst=快照数据[0];
返回容器(…);
否则{
返回文本(“等待数据…”);
}
},
);

试试这个,因为我知道您不能在重写方法
initState()
中使用wait,所以这是我通常做的,它工作正常

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

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

不幸的是,这不起作用,但你需要调用一个setState,因为这些是局部变量,我已经编辑了Asyncint()。实际上效果很好,你能看看这篇文章并帮我解决一下吗:
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...");
    }
  },
);
@override
  void initState() {
    super.initState();
    asyncInit();
  }

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