FutureBuilder не завершается при использовании Anmiation внутри
У меня есть FutureBuilder, где я получаю данные из Firestore. Я делаю это в initState, как это часто предлагалось здесь.
Future<Tour> _tour;
@override
void initState() {
super.initState();
_tour = _tourService.getTourDataPerEmployee(employeeID: userinfo.user.uid);
}
Мой FutureBuilder выглядит так:
FutureBuilder(
future: _tour,
builder: (context, snapshot) {
if (snapshot.hasData) {
print(snapshot.data.waypoints);
return Container(
child: ListView.builder(
itemCount: snapshot.data.waypoints.length,
itemBuilder: (context, index) {
return TimelineTile(
nodePosition: 0.03,
contents: TourTile(
tour: snapshot.data,
index: index,
),
node: TimelineNode(
indicator: CustomIndicator(
finished: snapshot.data.waypoints[index].finished),
startConnector: CustomConnector(
finished: snapshot.data.waypoints[index].finished,
inProgress: false),
endConnector: CustomConnector(
finished: snapshot.data.waypoints[index].finished,
inProgress: index >= snapshot.data.waypoints.length - 1
? true
: snapshot.data.waypoints[index + 1].finished
? false
: true),
),
);
},
));
} else {
return Center(child: Text("Please wait"));
}
},
),
Вот как я пытался добавить анимацию:
CircularProgressIndicator()
Это прекрасно работает, но когда я пытаюсь заменить простой текст («Подождите») анимацией, я получаю странные результаты. Я вообще не мог получить никакого результата от будущего, иногда результатов было мало. Иногда кажется, что данные просто не поступают, потому что snapshot.data иногда печатает null, иногда все результаты есть. Я не вижу согласованности между анимацией и конструктором.
1 ответ
Решение
Попробуй это:
Future<Tour> _tour;
getTours() async {
return await _tourService.getTourDataPerEmployee(employeeID: userinfo.user.uid);
}
@override
void initState() {
super.initState();
_tour = getTours();
}
Затем в виджете:
FutureBuilder(
future: _tour,
builder: (context, snapshot) {
if (snapshot.hasData) {
print(snapshot.data.waypoints);
return Container(
child: ListView.builder(
itemCount: snapshot.data.waypoints.length,
itemBuilder: (context, index) {
return TimelineTile(
nodePosition: 0.03,
contents: TourTile(
tour: snapshot.data,
index: index,
),
node: TimelineNode(
indicator: CustomIndicator(
finished: snapshot.data.waypoints[index].finished),
startConnector: CustomConnector(
finished: snapshot.data.waypoints[index].finished,
inProgress: false),
endConnector: CustomConnector(
finished: snapshot.data.waypoints[index].finished,
inProgress: index >= snapshot.data.waypoints.length - 1
? true
: snapshot.data.waypoints[index + 1].finished
? false
: true),
),
);
},
));
} else {
return CircularProgressIndicator();
}
},
),
вы даже можете вызвать getTours() в будущем
FutureBuilder(
future: getTours(),