Сохранение потока дротиков 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, и я могу использовать его в приложении для проверки аутентификации, отображения различных маршрутов, получения текущего пользователя и т. д.

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