Я использую FirebaseAnimatedList в приложении чата Flutter / Dart. Упрощенный метод build () выглядит следующим образом:
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text(_onLineStatus), // <-- This text value changed using setState()
),
body: Column(
children: <Widget>[
Flexible(
child: FirebaseAnimatedList(
query: reference,
sort: (a, b) => b.key.compareTo(a.key),
padding: EdgeInsets.all(8.0),
reverse: true,
itemBuilder: (BuildContext context, DataSnapshot snapshot,
Animation<double> animation, int index) {
return ChatMessage(snapshot: snapshot, animation: animation);
},
),
),
Divider(height: 1.0),
Container(
decoration: BoxDecoration(color: Theme.of(context).cardColor),
child: _buildTextComposer(),
)
],
));
}
Я хочу изменить значение _onLineStatus
в строке 5 на основе значения события, возвращаемого слушателем, в основном, чтобы указать, включен ли другой участник чата или отключен. Я хочу, чтобы любое изменение статуса отражалось немедленно. Очевидный способ сделать это - использовать setState (), но, конечно, это вызывает полный повторный запуск метода build (), который, следовательно, повторно запускает запрос FirebaseAnimatedList, снова загружая те же данные. Я хочу этого избежать.
Все примеры использования FirebaseAnimatedList показывают его как часть метода build (), однако нам рекомендуется избегать помещения вызовов базы данных в build (), чтобы избежать этих побочных эффектов, поскольку build () может запускаться несколько раз.
Поэтому мои вопросы таковы:
- Как я могу переместить вызов FirebaseAnimatedList вне метода build (), чтобы я мог использовать setState () для обновления значения свойства AppBar title: БЕЗ его повторного запуска FirebaseAnimatedList?
OR...
- Как я могу обновить значение свойства AppBar title: без повторного запуска метода build (), т.е. без вызова setState ()?