2

我是 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();

并使用它来管理应用程序。我在现有代码中遇到的问题是 Stream 状态会立即标记为已完成,因此不会从onAuthStateChanged. 实际上,我需要AuthWidget在应用程序的整个生命周期中继续监听,以便我可以响应登录/注销事件并相应地更改 UI。

任何帮助是极大的赞赏!

4

1 回答 1

0

好的,我最终设法使用略有不同的技术提出了一个解决方案。感谢 Aaron K Saunders 的这篇文章的指点 - https://dev.to/aaronksaunders/simple-login-flow-in-flutter-then-firebase-part-one-29n6

本质上,我AuthService现在实现了一个 ChangeNotifier,我可以在应用程序周围使用它来检查身份验证、显示不同的路线、获取当前用户等。

于 2020-07-05T14:43:50.967 回答