Flutter / Dart - вызов функции, которая является Future <String>..., но должна возвращать только строку - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть асинхронная функция, которая вызывает 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 (string 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();, но это показывает ошибку в ожидании.

Любые идеи приветствуются.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Когда вам нужно вызывать будущее?

Вы всегда можете создать переменную 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.

Я надеюсь, что мое состояние set не содержит никаких синтаксических ошибок.

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

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

0 голосов
/ 17 декабря 2018

вы не можете использовать await в функции, которая не является асинхронной, что означает, что использование

var setList = await getSetList();

в вашей функции сборки неверно.

...