首页 > 解决方案 > 没有输入的 Dart Stream

问题描述

我正在创建一个基于 firebase auth 和具有颤振、飞镖和 bloc 模式的在线数据库的应用程序。我想创建一个启动屏幕来检查用户是否已经使用 firebase auth 登录,以便我可以根据当前状态将用户引导到另一个页面。

所以我决定为 SplashScreen 使用流(即 StatelessWidget)并创建一个 StreamBuilder 来等待一些流返回值。但是在流中我没有输入值。那么在这种情况下我应该使用流吗?我该如何植入它。

class SplashScreen extends StatelessWidget {
Widget build(context) {
  final bloc = BlocProvider.of(context);
  return FutureBuilder(
    future: bloc.loadUser(),
    builder: (context, snapshot) {
      if(snapshot.hasData) {
        if(snapshot.data == null) {
          Navigator.pushNamed(context, '/login');
        } else {
          Navigator.pushNamed(context, '/main');
        }
      } else {
        return Scaffold(
          body: Center(
            child: Column(
              children: <Widget>[
                Text('Loading', style: TextStyle(fontSize: 20.0)),
                CircularProgressIndicator(),
              ],
            ),
          ),
        );
      }
    }
  );
}
}

标签: streamdartflutter

解决方案


所以,我实现了类似的东西,它是这样的:

在我的主应用程序中,我检查用户是否以这种方式登录:

bool isLoggedIn = true;
@override
void initState() {
  FirebaseAuth.instance.currentUser().then((user) {
    setState(() {
      isLoggedIn = user != null;
    });
  });
  super.initState();
}

在我的构建中,我相应地改变了我的观点:

@override
Widget build(BuildContext context) {
  return AppProvider(
    child: MaterialApp(
      title: 'My Sample Title',
      home: isLoggedIn ? HomePage() : LoginPage(),
    ),
  );
}

我知道这种方法并没有完全使用 bloc 模式,但也可以这样做。我在项目的大部分区域都使用了 bloc 模式(比如检查用户信息是否已经存在于我的主页中)。


推荐阅读