flutter - 使Flutter Dart 流保持打开状态以查看模型的更改

标签 flutter dart dart-stream

我是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。
任何帮助是极大的赞赏!

最佳答案

好的,我最终使用稍微不同的技术提出了一个解决方案。感谢Aaron K Saunders的这篇文章作为指针-https://dev.to/aaronksaunders/simple-login-flow-in-flutter-then-firebase-part-one-29n6
本质上,我的AuthService现在实现了一个ChangeNotifier,我可以在应用程序中使用它来检查身份验证,显示不同的路由,获取当前用户等。

关于flutter - 使Flutter Dart 流保持打开状态以查看模型的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62739991/

相关文章:

flutter - Flutter:如何从流中获取所有数据,然后监听同一流中的新更新?

android - flutter: 无法运行基本的 hello world 程序,因为 ' Execution failed for task ' :app:packageDebug'。 '

java - Flutter 原生 android 回调

flutter - 为什么 dart 有 get 和 set 的特殊关键字?

flutter - 在Flutter中取消StreamSubscription

flutter - 使用Flutter从Firebase Firestore查询中获取单个文档

Flutter - 堆叠在一张条形图中的水平条形图

flutter - 如何在 BottomNavigationBar 中的小部件元素内添加 TabBarView

dart - double.infinity 和 MediaQuery 有什么区别?

dart - 如何使用Dart将数字单词转换为int(如3到3)