首页 > 解决方案 > Stream 构建一堆 Widget

问题描述

因此,我使用流来跟踪用户的身份验证状态。这是我的设置,到目前为止效果很好。

class Root extends ConsumerWidget {
  final Widget _loadingView = Container(color: Colors.white, alignment: Alignment.center, child: UiHelper.circularProgress);

  @override
  Widget build(BuildContext context, ScopedReader watch) {
    return watch(userStreamProvider).when(
      loading: () => _loadingView,
      error: (error, stackTrace) => _loadingView,
      data: (user) => user?.emailVerified == true ? Products() : Login(),
    );
  }
}

问题是,流多次构建 UI。我的产品页面中有一个欢迎对话框,它会打开多次,一旦我启动应用程序,它就会变得一团糟。

我应该怎么做才能避免这种情况?

** 这里我使用的是riverpod包

标签: flutterdartstreamstackriverpod

解决方案


我个人建议使用onAuthStateChanged流将您的小部件与StreamBuilder一起包装。当用户更改其状态(登录或退出)时,此流会自动更新。这是一个可以帮助你的例子!

Stream<FirebaseUser> authStateChanges() {
  FirebaseAuth _firebaseInstance = FirebaseAuth.instance;
  return _firebaseInstance.onAuthStateChanged;
}


return StreamBuilder(
  stream: authStateChanges(),
  builder: (context, AsyncSnapshot snapshot) {
    if (snapshot.hasData) {

      // isLoggedIn
      
    } else if (snapshot.hasData == false &&
      snapshot.connectionState == ConnectionState.active) {

      // isLoggedOut

    } else {

      // loadingView

    }
  },
);

推荐阅读