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

Я создал приложение 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),
                  ),
              )
            ),
          ],
        );
  }

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


person David L    schedule 24.09.2020    source источник
comment
Я думаю, что один из способов сделать это - проверить интернет-соединение пользователя с помощью пакета подключения.   -  person Uni    schedule 24.09.2020


Ответы (1)


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

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

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

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

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

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

person Frank van Puffelen    schedule 24.09.2020