Как дождаться обычного (не asyn c) кода (функции) во флаттере? - PullRequest
0 голосов
/ 27 мая 2020

Я хочу найти слово в большом текстовом файле, который является локальным (без вызова HTTP или API). Я использую его с FutureBuilder, потому что только текстовый файл открывается asyn c (остальные - нет), но само открытие происходит очень быстро. Я хочу отобразить CircularProgressIndicator во время поиска, но мне кажется, что в момент завершения открытия файла, CircularProgressIndicator останавливает , и у меня появляется пустой экран для долгое время поиска.

Что я могу сделать, чтобы отобразить экран загрузки при выполнении обычного для l oop?

У меня есть что-то вроде этого псевдокода:

Future<Array> searchData() async{
    results = [];
    someBigTextFile= await getTextFile();
    for(row in someBigTextFile){ // this loop takes a lot of time
        if(row contains this.query) results.add(row);
    }
    return results;
}

Widget buildResults(BuildContext context) {
  return FutureBuilder(
    future: searchData(),
    builder: (BuildContext context, AsyncSnapshot<Array> snapshot){
        if (snapshot.connectionState != ConnectionState.done) {
           print("not done yet");
           return CircularProgressIndicator();
        } else {
           return snapshot.data;
        }
  }
}

1 Ответ

0 голосов
/ 27 мая 2020

Попробуйте. С помощью синтаксиса .then () вы можете специально остановить запуск кода syn c до того, как вернется будущее.

  Future<Array> searchData() async{
    results = [];
    await getTextFile().then((someBigTextFile){
        for(row in someBigTextFile){ // this loop takes a lot of time
        if(row contains this.query) results.add(row);
    }
    return results;
    });

}
...