首页 > 解决方案 > Flutter/Dart - 调用一个未来的函数...但只需要返回一个字符串

问题描述

我有一个异步函数正在调用 Firestore 以获取数据值。我在上一篇文章中得到了很多帮助……学到了很多……并希望从一个更清晰的问题重新开始。所以我有以下功能

Future<String> getSetList () async {

DocumentReference set01DocRef = Firestore.instance.collection('sets').document('SET01');

var snapshot = await set01DocRef.get();

songList = snapshot['songs']; //works, get expected text value from FS

return songList;
}

此函数逻辑有效...我可以将 songList var(字符串 var)打印()到控制台,我可以看到 Firestore 中的值。当我尝试调用该函数时:

@override
  Widget build(BuildContext context) {

    var setList = getSetList();

    print('In widget:  ' + setList.toString()); //shows as instance of Future<String>

    //List<String> items = setList.split('|');
    List<String> items = ['Red','White','Blue'];

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),

该 setList 变量不是字符串。当我打印它 [print(setList.toString()] 时,它显示为 Future String 的一个实例。

我尝试使用:var setList = await getSetList();但在等待时显示错误。

任何想法表示赞赏。

标签: asynchronousdartfluttergoogle-cloud-firestorefuture

解决方案


什么时候需要给未来打电话?

您始终可以创建一个 tmp 变量并尝试加载它。您不能将期货随机放入构建过程中。如果视图已更改,您需要获取数据然后调用 setState 来通知小部件。

String _setList = null;
//initState called when the widget is mounted.
void initState() {
    super.initState();
    if(_setList == null){
       getSetList().then(
          (String s) => setState(() {_setList = s;})
       );
    }
}

@override
  Widget build(BuildContext context) {

    String setList = _setList;

    print('In widget:  ' + setList.toString()); //shows as instance of Future<String>
    if(setList != null){
    //List<String> items = setList.split('|');
    List<String> items = ['Red','White','Blue'];

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
    } else { return const CircularProgressIndicator();  }
    //Create a progress circle.

我希望我的设置状态没有任何语法错误。

https://docs.flutter.io/flutter/widgets/State/setState.html

https://docs.flutter.io/flutter/widgets/State/initState.html


推荐阅读