【问题标题】:Scoping of variables变量范围
【发布时间】:2020-08-10 04:43:57
【问题描述】:

我调试了以下代码,尽管项目确实添加到了 returnDC 列表中,但由于某种原因,returnDC 列表始终为空。 这可能是范围界定问题,但我不确定。

class _MyGridState extends State<MyGrid> {
  @override
  Widget build(BuildContext context) {
    return DataTable(columns: getDataColumnTest(), rows: [
      DataRow(cells: [
        DataCell(Text('sdf')),
        DataCell(Text('sdf')),
      ]),

    ]);
  }
Future List<DataColumn> getDataColumnTest() async {
    dbutils db = dbutils();
    List<DataColumn> returnDC = List<DataColumn>();

    AuthResult results = await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: 'XXX@gmail.com', password: 'WOWOW');
    DocumentSnapshot ds = await Firestore.instance.document(
        'Settings' + '/' + 'hey').get();
    ds.data.map((f, d) {
      DataColumn dc =
      DataColumn(label: Text(f.toString()), tooltip: d.toString());
      returnDC.add(dc);
    });

    return returnDC;
  }

我们将不胜感激任何助手 阿西

【问题讨论】:

  • async-await 或使用回调,因为 api 本质上是异步的

标签: firebase flutter google-cloud-firestore firebase-authentication


【解决方案1】:

尝试以下方法:

Future<List<DataColumn>> getDataColumnTest() async{

    dbutils db = dbutils();
    List<DataColumn> returnDC = List<DataColumn>();

    AuthResult results = await FirebaseAuth.instance.signInWithEmailAndPassword(email: 'XXX@gmail.com', password: 'WOWOW');
      DocumentSnapshot ds = await Firestore.instance.document('Settings' + '/' + 'hey').get();
        ds.data.map((f, d) {
          DataColumn dc =
              DataColumn(label: Text(f.toString()), tooltip: d.toString());
          returnDC.add(dc);
        });
      });
    });
    return returnDC;
  }

api是异步的,所以你需要使用asyncawait等待数据被取回,然后才能返回列表。


由于这是在build 方法中,所以你可以使用FutureBuilder

            FutureBuilder(
              future:
                  getDataColumnTest(), 
             builder: (BuildContext context, AsyncSnapshot<DataColumn> snapshot) {
                if (snapshot.hasData) {
                  return Text(snapshot.data);
                } else if (snapshot.hasError) {
                  return Text("${snapshot.error}");
                }

                // By default, show a loading spinner.
                return CircularProgressIndicator();
              },
            )

【讨论】:

  • Peter:在这种情况下,返回类型必须是 Future,即使我添加 Future 关键字,我也会收到编译器错误“方法必须有一个明确的参数列表”。顺便说一句,我不确定使用 Future 是否有效,因为我从 Widget 调用此方法(但我可能错了),我根据您的解决方案修改了问题
  • 没错,如果你在构建方法中调用它,它必须是Future&lt;List&lt;DataColumn&gt;&gt;,那么我建议使用FutureBuilder
  • 所以这应该返回一个Future 然后在小部件FutureBuilder 它有一个名为future 的属性,您可以将它作为一个值赋予它这个函数
  • 你能用 FutureBuilder 修改它吗?
  • @AsiB 检查编辑应该可以工作,当然 Text 小部件您可以删除它并使用其他东西,因为 snapshot.data 可能不会返回字符串
猜你喜欢
  • 1970-01-01
  • 2014-01-31
  • 2011-02-10
  • 2020-02-07
  • 2012-12-23
  • 2011-05-10
相关资源
最近更新 更多