如何以简洁方式在用户重载时显示加载指示器?
问题解答
方案通用性说明
- FutureBuilder:Flutter原生组件,无需依赖任何第三方库,只要有异步Future就能配合使用,适配所有Flutter项目,通用性拉满。但它的状态是局部的,没法跨组件共享,适合单个页面内的异步状态展示。
- Riverpod FutureProvider:依赖Riverpod状态管理库,适合已经用Riverpod做全局状态管理的项目。它的优势是能跨组件共享异步状态和加载状态,代码结构更清晰,避免嵌套回调,但需要先引入Riverpod依赖,对于未使用该库的项目来说有点额外成本,但本身方案是通用的。
更简洁的实现方式(适配你现有代码)
你已经在用Riverpod的authLoadingProvider,完全可以直接基于这个Provider实现加载状态控制,不用额外套FutureProvider或FutureBuilder,逻辑更连贯:
修正后的业务逻辑代码
void currentUserNotNull(User? user, WidgetRef ref) async { try { // 开始重载前开启加载状态 ref.read(authLoadingProvider.notifier).update((_) => true); final currentUser = FirebaseAuth.instance.currentUser; await currentUser?.reload(); // 可选:重载完成后更新用户信息到对应的Provider // ref.read(currentUserProvider.notifier).state = currentUser; } on FirebaseAuthException catch (e) { // 这里可以加异常处理,比如给用户提示 // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(e.message ?? '用户信息重载失败'))); } finally { // 不管成功失败,最后都关闭加载状态 ref.read(authLoadingProvider.notifier).update((_) => false); } }
UI层使用加载状态
在需要显示加载指示器的页面,监听authLoadingProvider即可:
@override Widget build(BuildContext context, WidgetRef ref) { final isLoading = ref.watch(authLoadingProvider); return Stack( children: [ // 你的页面主体内容 // ... // 加载状态显示 if (isLoading) const Center( child: CircularProgressIndicator(), ), ], ); }
这种方式完全复用你已有的状态管理逻辑,没有额外的冗余代码,是最贴合你当前代码结构的简洁方案。
总结
- FutureBuilder和Riverpod FutureProvider都是通用方案,根据项目是否使用状态管理库选择即可。
- 如果你已经在用Riverpod管理加载状态,直接在重载前后更新
authLoadingProvider的方式最简洁,无需引入其他机制。
内容的提问来源于stack exchange,提问作者SugiuraY
相关产品推荐
相关产品推荐

