没有输入的Dart Stream

时间:2018-08-03 15:23:31

标签: stream dart flutter

我正在创建一个基于Firebase身份验证和具有Flutter,Dart和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(),
              ],
            ),
          ),
        );
      }
    }
  );
}
}

1 个答案:

答案 0 :(得分:0)

所以,我实现了类似的功能,它是这样的:

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

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(),
    ),
  );
}

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