【问题标题】:Dart Stream with no input没有输入的 Dart Stream
【发布时间】:2019-01-11 12:48:01
【问题描述】:

我正在创建一个基于 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(),
              ],
            ),
          ),
        );
      }
    }
  );
}
}

【问题讨论】:

  • 您不会提供身份验证状态作为流的输入吗?您打算允许用户注销并再次显示初始屏幕,还是应该仅在应用程序启动期间显示初始屏幕,直到完成身份验证,然后在应用程序关闭并稍后重新启动时才显示?
  • 我不认为提供 authenticationstate 是一个好方法。因为它是一个异步函数输出。启动画面仅用于应用程序启动,仅用于获取数据和其他内容。
  • 那么FutureBuilder 应该这样做
  • FutureBuilder 的问题是我无法在 FutureBuilder 中调用 Navigator
  • 这太疯狂了,但确实有效,谢谢:))

标签: stream dart flutter


【解决方案1】:

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

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

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 模式(例如检查用户信息是否已经存在于我的主页中)。

【讨论】:

  • 我认为在FutureBuilder 中使用Future.delayed 是一种更好的方法,原因有二。首先它使用 bloc 模式而不是 Stateful 小部件,其次它会产生延迟,以便更好地显示启动画面
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2014-01-10
  • 2019-09-10
  • 1970-01-01
  • 2019-09-21
  • 2020-01-29
  • 2021-07-22
相关资源
最近更新 更多