flutter - 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包
解决方案
我个人建议使用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
}
},
);
推荐阅读
- python - 如何使用python将元素添加到json对象中的特定位置
- c++ - 我可以为随机数生成种子作为函数的静态变量吗?
- python - 如何将只有音频的 mp4 转换为 numpy 数组
- sql-server - 从自定义日期计算周数
- python - 检查是否在单元测试中调用了 Timer.cancel
- php - 使用 .htaccess 文件限制对文件夹中文件的访问
- javascript - 以编程方式更改为对象中的另一个键
- python-3.x - 如何更改单个颜色条标签的字体粗细?
- angular - 使用 Azure AD for Angular 进行身份验证和授权 - API 应用程序
- javascript - javascript中带有分号的多个电子邮件验证正则表达式