Flutter/Dart - 调用一个 Future<String> ...但只需要返回一个 String 的函数

Posted

技术标签:

【中文标题】Flutter/Dart - 调用一个 Future<String> ...但只需要返回一个 String 的函数【英文标题】:Flutter/Dart - calling a function that is a Future<String> ... but needs to return only a String 【发布时间】:2019-05-18 03:02:25 【问题描述】:

我有一个异步函数正在调用 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();,但在等待时显示错误。

任何想法表示赞赏。

【问题讨论】:

正如my answer to your previous question 中的cmets 中所述,当您调用async 方法时,您需要使用await 来获取值(而不是Future 值)。并且任何使用await 的方法本身都必须标记为async 感谢您一直以来的帮助...我很抱歉我仍然没有“明白”。我会继续阅读和尝试。 【参考方案1】:

什么时候需要调用未来?

您始终可以创建一个 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

【讨论】:

我不敢相信我的语法是正确的。我从来没有跑过它。我写了一个简单的例子 我唯一需要调整的是 'const setList...' 必须是 'String setList ...' 非常感谢。 一个很好的例子@user1462442。谢谢。 Flutter 2.0.5 中需要做一些小的调整(主要是 Nullability 问题)。字符串 _setList = ""; (null 不能分配给 String 类型)。【参考方案2】:

你不能在非异步的函数中使用await,这意味着使用

var setList = await getSetList();

在你的构建函数中是错误的。

【讨论】:

以上是关于Flutter/Dart - 调用一个 Future<String> ...但只需要返回一个 String 的函数的主要内容,如果未能解决你的问题,请参考以下文章

Flutter/Dart - 调用一个 Future<String> ...但只需要返回一个 String 的函数

flutter Dart语言List如何获取索引值

Flutter (Dart 2) 访问 twitter GET api

如何将 TextButton 背景颜色输入到 Flutter/dart 中的函数

Flutter/Dart:将参数传递给有状态的小部件?

如何在 Flutter dart 的列表中的循环内附加数据?