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

如何在Flutter中实现类iOS默认样式的自定义进度对话框?

实现iOS风格的自定义进度对话框(Flutter)

你现在用的是Material风格的CircularProgressIndicator放在页面中心,这和iOS系统默认的进度对话框样式差得有点远。要实现iOS原生那种弹出式、带半透明背景的进度对话框,咱们得用Flutter专门提供的Cupertino组件库,它就是用来复刻iOS原生UI的。

直接上完整的实现代码,你可以直接复制运行:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'iOS Style Progress Dialog',
      theme: ThemeData(primarySwatch: Colors.red),
      home: const ProgressBarScreen(),
    );
  }
}

class ProgressBarScreen extends StatelessWidget {
  const ProgressBarScreen({super.key});

  // 显示iOS风格进度对话框的方法
  void _showiOSProgressDialog(BuildContext context) {
    showCupertinoDialog(
      context: context,
      // 禁止点击外部关闭对话框,和iOS原生行为一致
      barrierDismissible: false,
      builder: (BuildContext context) {
        // 使用CupertinoPopupSurface模拟iOS原生对话框的圆角和背景
        return CupertinoPopupSurface(
          isSurfacePainted: true,
          child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 24),
            child: Column(
              // 最小化对话框尺寸,避免占满屏幕
              mainAxisSize: MainAxisSize.min,
              children: [
                // iOS风格的加载指示器
                const CupertinoActivityIndicator(
                  radius: 16, // 调整大小,贴近iOS默认
                  color: CupertinoColors.activeBlue,
                ),
                const SizedBox(height: 16),
                // 可选的提示文字
                const Text(
                  '加载中...',
                  style: TextStyle(
                    fontSize: 16,
                    color: CupertinoColors.secondaryLabel,
                  ),
                ),
              ],
            ),
          ),
        );
      },
    );

    // 模拟加载完成后关闭对话框(实际开发中替换成你的异步任务逻辑)
    Future.delayed(const Duration(seconds: 3), () {
      Navigator.of(context).pop();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: const Color(0xFFB50208),
        title: const Text('Progressbar'),
      ),
      body: Center(
        // 用CupertinoButton保证按钮风格也贴近iOS
        child: CupertinoButton(
          color: const Color(0xFFB50208),
          onPressed: () => _showiOSProgressDialog(context),
          child: const Text('显示进度对话框'),
        ),
      ),
    );
  }
}

关键细节说明:

  • showCupertinoDialog:专门用于触发iOS风格的对话框,替代Material的showDialog,它自带iOS的弹出动画和半透明背景。
  • CupertinoActivityIndicator:iOS原生样式的加载指示器,和你原来用的CircularProgressIndicator完全不同,视觉上更贴近iOS系统。
  • CupertinoPopupSurface:提供iOS对话框特有的圆角和磨砂质感背景,比直接用CupertinoAlertDialog更贴近原生样式。
  • barrierDismissible: false:这是iOS进度对话框的默认行为——用户不能通过点击外部关闭,必须等待任务完成。

如果需要更个性化的调整,比如修改指示器颜色、对话框圆角大小,直接调整对应组件的属性就行。比如给CupertinoPopupSurface设置borderRadius,或者给CupertinoActivityIndicator换color。

内容的提问来源于stack exchange,提问作者Ankit Kumar Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:37:38