Как изменить заголовок AppBar: «Значение без повторного запуска FirebaseAnimatedList - PullRequest
0 голосов
/ 15 апреля 2020

Я использую 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 () может быть запущен несколько раз.

Поэтому у меня следующие вопросы:

  1. Как я могу переместить вызов FirebaseAnimatedList вне метода build (), чтобы я мог использовать setState () обновить значение заголовка AppBar: свойство БЕЗ перезапуска FirebaseAnimatedList?

ИЛИ ...

Как обновить значение свойства title: свойство AppBar без повторного запуска метода build () ie. без вызова setState ()?

1 Ответ

1 голос
/ 15 апреля 2020

Создайте StateFullWidget, содержащий панель приложения. Примерно так:

Widget build(BuildContext context) {
    return new Scaffold(
        appBar: CustomAppBar(), 
        body: Column(
        ...

А затем ваш новый виджет панели приложений:

class CustomAppBar extends StatefulWidget {
  @override
  _CustomAppBarState createState() => _CustomAppBarState();
}

class _CustomAppBarState extends State<CustomAppBar> {
  String _onLineStatus = "online";

  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: Text(_onLineStatus),
    );
  }
}

, так что вы можете самостоятельно перестроить панель приложений из списка. Вам нужно позвонить setState в вашем новом виджете.

...