Правильно ли я думаю об этом?
Я создал функцию, которая принимает значение из 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,
));
}
}),
)
Не нужно звонить 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> });
}
Должен ли быть
;
между двумя картами?