Как узнать, находятся ли записи в Firebase на сервере или только в кэше?

#flutter #firebase-realtime-database #offline-caching

#flutter #firebase-realtime-database #автономное кэширование

Вопрос:

Я создал приложение Agro, в котором большинство пользователей находятся в автономном режиме, когда они регистрируют данные, а когда они возвращаются на центральный сайт, они получают подключение к Интернету, и данные обновляются.

Однако пользователю неясно, была ли его запись загружена в облако, поэтому я хотел бы внедрить систему тиков, аналогичную той, которая используется WhatsApp:

  • Серая галочка, когда данные записаны и находятся только в кэше

  • Синяя галочка, когда данные загружаются в облако и, следовательно, доступны другим пользователям

Я представляю себе что-то вроде этого: Список с серой галочкой и синей галочкой в зависимости от того, находятся ли данные уже на сервере

Процедура, с помощью которой я отображаю список, выглядит следующим образом:

 Widget _crearListado(BuildContext context, AlimentarBloc alimentarBloc) {

    return Column(
      children: <Widget>[

        Container(
          child: Padding(
            child: StreamBuilder(
                stream: alimentarBloc.alimentarStream,
                builder: (BuildContext context, AsyncSnapshot<List<AlimentarModel>> snapshot){
                  if (snapshot.hasData) {
                    final alimentarList = snapshot.data;
                    if (alimentarList.length == 0) return _imagenInicial(context);
                    return Container(
                      child: Stack(
                        children: <Widget>[
                          ListView.builder(
                            itemCount: alimentarList.length,
                            itemBuilder: (context, i) =>_crearItem(context, alimentarBloc, alimentarList[i]),
                        ],
                      ),
                    );
                  } else if (snapshot.hasError) {
                    return Text(snapshot.error.toString());
                  } 
                    return Center (child: Image(image: AssetImage('assets/Preloader.gif'), height: 200.0,));
                },
            ),
          ),
        ),
      ],
    );
  }

  Widget _crearItem(BuildContext context, AlimentarBloc alimentarBloc, AlimentarModel alimentar) { 

      return Stack( 
          alignment: Alignment.centerLeft,
          children: <Widget>[
            Container(
              child: Card(
                  child: ListTile(
                    leading: Container(, 
                      child: Text(" ${alimentar.nombreRefEstanque}"),
                    ),
                    title: Text('${alimentar.nombreAlimentoFull}'),
                    subtitle: Container(
                      child: Container(
                            child: Text ('$_fechaAlimentar)
                      ),
                    ),
                    onTap: () => null,
                    trailing: Container(
                      child: Text("${alimentar.consumo),
                  ),
              )
            ),
          ],
        );
  }
  

Какие параметры вы видите, чтобы пометить данные, когда они уже загружены в Интернет? Могу ли я это сделать?

Комментарии:

1. Я думаю, что один из способов сделать это — проверить подключение пользователя к Интернету с помощью пакета подключения

Ответ №1:

К сожалению, база данных Firebase Realtime не имеет встроенного маркера на моментальном снимке данных, чтобы указать, был ли он синхронизирован с сервером.

Самый простой подход к реализации чего-то подобного — добавить прослушиватель завершения к операции записи и пометить запись как завершенную при вызове этого прослушивателя. Однако это работает только пока приложение остается активным. Если приложение будет перезапущено, ваши данные будут синхронизированы позже, но обработчик завершения не будет вызван.

Если вы также хотите обработать этот случай, вы можете записать значение маркера в базу данных при запуске приложения и добавить для этого прослушиватель завершения. После записи прослушивателя завершения для значения маркера вы знаете, что все записи, которые были поставлены в очередь до этого, также были обработаны сервером.

Вы могли бы объединить два подхода и:

  1. Храните набор незавершенных операций записи в локальном хранилище.
  2. Добавьте ключ каждого элемента, который вы записываете.
  3. Удалите ключ для элемента при вызове его обработчика завершения.
  4. Очистите весь список при перезапуске приложения и подтвердите значение вашего маркера.

Кстати: это одна из областей, где Cloud Firestore (другая база данных, являющаяся частью Firebase) имеет гораздо лучший API, поскольку у него есть hasPendingWrites свойство, указывающее, есть ли ожидающие записи на моментальном снимке.