Flutter: обновление более свежего значения, когда пользователь просматривает страницу с потоками

Правильно ли я думаю об этом?

Я создал функцию, которая принимает значение из firebase, значение в секундах и преобразует его в часы:минуты:секунды, это отлично работает. Я использовал Streams для своей функции и StreamBuilder для своего текстового виджета для отображения значения, но без setState я не знаю, как еще всегда показывать более новое значение, пока пользователь активно просматривает страницу. Без setState мне пришлось бы перейти на другую страницу, а затем вернуться, чтобы увидеть, как пользовательский интерфейс обновляет самое последнее значение.

Является ли использование setState правильным способом сделать это? Не приведет ли это к спаму записей в firebase, что приведет к превышению лимита (у меня есть бесплатная учетная запись firebase).

Есть ли лучший способ всегда показывать самое актуальное значение на экране?

Stream<String> printDuration() async* {
   FirebaseFirestore.instance
        .collection("users")
        .doc(user!.uid)
        .snapshots()
        .listen(
          (event) => someVar = event.data()!['timeActive'], 
          onError: (error) => print("Listen failed: $error")
        );

    Duration duration = Duration(seconds: someVar ?? loggedInUser.timeActive);
      String twoDigits(int n) => n.toString().padLeft(2, "0");
    String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
    String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
    String _getData = "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
    setState(() {});
    yield _getData;
  }

текстовый виджет


StreamBuilder<String>(
                                  stream: printDuration(),
                                  builder: ((context, snapshot) {
                                    if (snapshot.data != null) {
                                      return Center(
                                        child: Text(
                                          snapshot.hasData ? snapshot.data!.toString(): 'no data yet',
                                          style: TextStyle(
                                            color: Color(0xff516395),
                                            fontSize: 26.0,
                                            letterSpacing: 2.0,
                                            fontWeight: FontWeight.bold,
                                          ),
                                        ),
                                      );
                                    } else {
                                      return Text('0',
                                          style: TextStyle(
                                            color: Color(0xff516395),
                                            fontSize: 30.0,
                                            letterSpacing: 2.0,
                                            fontWeight: FontWeight.bold,
                                          ));
                                    }
                                  }),
                                )
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
12
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не нужно звонить setState, StreamBuilder строится на последнем обновлении. Попробуйте что-нибудь вроде этого.

  Stream<String> timeActive(String userUid) {
    return FirebaseFirestore.instance
      .collection("users")
      .doc(userUid)
      .snapshots()
      .map((e) => e.data()?['timeActive'])
      .map((timeActive) { <convert to hours:minutes:seconds> });
  }

Должен ли быть ; между двумя картами?

CodeConfusion 07.05.2022 22:42

Другие вопросы по теме