Я использую 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: свойство БЕЗ перезапуска FirebaseAnimatedList?
ИЛИ ...
Как обновить значение свойства title: свойство AppBar без повторного запуска метода build () ie. без вызова setState ()?