You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以简洁方式在用户重载时显示加载指示器?

问题解答

方案通用性说明

  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:30:17