#flutter #dart #stream #stack #riverpod
#flutter #dart #поток #стек #riverpod
Вопрос:
Итак, я использую поток для отслеживания состояния аутентификации пользователя. Вот моя настройка, которая пока работает нормально.
class Root extends ConsumerWidget {
final Widget _loadingView = Container(color: Colors.white, alignment: Alignment.center, child: UiHelper.circularProgress);
@override
Widget build(BuildContext context, ScopedReader watch) {
return watch(userStreamProvider).when(
loading: () => _loadingView,
error: (error, stackTrace) => _loadingView,
data: (user) => user?.emailVerified == true ? Products() : Login(),
);
}
}
Проблема в том, что stream создает пользовательский интерфейс несколько раз. И у меня есть диалоговое окно приветствия на странице моих продуктов, которое открывается несколько раз, и как только я запускаю приложение, оно становится беспорядочным.
Что я должен сделать, чтобы избежать этого сценария?
** Здесь я использую пакет riverpod
Комментарии:
1. где вы определяете userStreamProvider?
Ответ №1:
Я лично рекомендую обернуть ваш виджет StreamBuilder с помощью потока onAuthStateChanged . Этот поток автоматически обновляется, когда пользователь меняет свое состояние (входит в систему или выходит). Вот пример, который может вам помочь!
Stream<FirebaseUser> authStateChanges() {
FirebaseAuth _firebaseInstance = FirebaseAuth.instance;
return _firebaseInstance.onAuthStateChanged;
}
return StreamBuilder(
stream: authStateChanges(),
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
// isLoggedIn
} else if (snapshot.hasData == false amp;amp;
snapshot.connectionState == ConnectionState.active) {
// isLoggedOut
} else {
// loadingView
}
},
);