Сохранение потока дротиков Flutter открытым для отслеживания изменений в модели
Я новичок во Flutter/Dart и пытаюсь создать базовую службу аутентификации. Моя простая задача - заставить мое основное приложение прослушивать поток, который будет излучать пользователя при выполнении действий аутентификации. Так работают многие примеры Firebase, с той лишь разницей, что я хочу подключиться напрямую к собственному API.
Для этого я создал AuthService, но на самом деле не могу заставить его работать.
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<AuthService>(
create: (_) => AuthService(),
child: MaterialApp(
home: AuthWidget()
)
);
}
}
class AuthWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context);
authService.getUser();
// wrap the application in a Stream that watches for the authentication state
// to change. On authentication state change,
return StreamBuilder<User>(
stream: authService.onAuthStateChanged,
builder: (context, snapshot) {
// check to ensure that the connectionState is active
if (snapshot.connectionState == ConnectionState.active) {
final user = snapshot.data;
return user == null ? Login() : Home();
}
return Login();
}
);
}
}
class AuthService {
User currentUser;
Future<User> getUser() {
return Future.value(currentUser);
}
void login(User user) {
currentUser = user;
}
void logout() {
currentUser = null;
}
Stream<User> get onAuthStateChanged {
return Stream.fromFuture(getUser());
}
}
Чего я хочу достичь
На верхнем уровне MyApp
, Я хотел бы иметь возможность отслеживать изменения в аутентификации с помощью AuthProvider. Я должен иметь доступ к провайдеру аутентификации где угодно, например
final auth = Provider.of<AuthService>(context, listen: false);
// log the user in
auth.login(user);
// log the user out
auth.logout(user);
// get the current authenticated user
auth.getUser();
И используйте это для управления приложением. Проблема, с которой я столкнулся с моим существующим кодом, заключается в том, что статус потока мгновенно помечается как выполненный, поэтому никакие дальнейшие изменения никогда не отправляются изonAuthStateChanged
. Мне действительно нужен мойAuthWidget
чтобы продолжать прослушивание в течение всего срока службы приложения, чтобы я мог реагировать на события входа / выхода и соответствующим образом изменять пользовательский интерфейс.
Любая помощь приветствуется!
1 ответ
Хорошо, в итоге мне удалось найти решение, используя немного другие методы. Благодаря этой статье Аарона К. Сондерса за указатели - https://dev.to/aaronksaunders/simple-login-flow-in-flutter-then-firebase-part-one-29n6
По сути мой AuthService
теперь реализует ChangeNotifier, и я могу использовать его в приложении для проверки аутентификации, отображения различных маршрутов, получения текущего пользователя и т. д.