Flutter进度对话框插件flutter_future_progress_dialog的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter进度对话框插件flutter_future_progress_dialog的使用

flutter_future_progress_dialog

Pub版本 许可证

在等待Future完成的过程中显示带有动画的进度对话框,并在完成后返回该Future的结果。

特性

演示

开始使用

安装库

flutter pub add flutter_future_progress_dialog

导入库

import 'package:flutter_future_progress_dialog/flutter_future_progress_dialog.dart';

使用方法

可以在这里找到完整的示例。

以下是一个简短的例子,展示如何使用showProgressDialog

基本用法

在您的函数中调用showProgressDialog。传递contextfuture参数。然后处理结果。

您还可以使用showCupertinoProgressDialog来显示带有Cupertino样式的对话框,或使用showAdaptiveProgressDialog来显示与主机操作系统匹配的对话框。

Future<String> myFuture() async {
  await Future.delayed(const Duration(seconds: 2));
  return 'my string';
}

Future<void> yourFunction(BuildContext context) async {
  final result = await showProgressDialog(
    context: context,
    future: () => myFuture(),
  );
  if (!mounted) {
    return;
  }
  switch (result) {
    case ResultError(error: final error):
      await showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            content: Text(
              '$error',
              textAlign: TextAlign.center,
            ),
            actions: [
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
                child: const Text(
                  'OK',
                ),
              ),
            ],
          );
        },
      );
    case ResultOk<String>(value: final value):
      // value变量将持有'my string'值
      break;
  } 
}

自定义进度对话框

您可以传递一个builder来自定义进度对话框。

Future<Result<LongRunningTaskResult>> buttonCallback({
  required BuildContext context,
}) async {
  return await showProgressDialog(
    future: () => myLongRunningTask(),
    context: context,
    builder: (context) => AlertDialog(
      content: Text('I am loading now'),
    ),
  );
}

示例代码

以下是完整的示例代码:

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

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

enum DialogType { material, cupertino, adaptive }

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  Future<int> myFuture(int value) async {
    await Future.delayed(const Duration(seconds: 2));
    if (value >= 3) {
      throw 'Something went wrong';
    }
    return value + 1;
  }

  Future<void> _onIncrementCounter({required BuildContext context, required DialogType dialogType}) async {
    final result = switch (dialogType) {
      DialogType.cupertino => await showCupertinoProgressDialog(
          context: context,
          future: () => myFuture(_counter),
        ),
      DialogType.material => await showProgressDialog(
          context: context,
          future: () => myFuture(_counter),
        ),
      DialogType.adaptive => await showAdaptiveProgressDialog(
          context: context,
          future: () => myFuture(_counter),
        ),
    };
    if (!mounted) {
      return;
    }
    switch (result) {
      case ResultOk<int>(value: final value):
        setState(() {
          _counter = value;
        });
        break;
      case ResultError(error: final error):
        await showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              content: Text(
                '$error',
                textAlign: TextAlign.center,
              ),
              actions: [
                TextButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                    setState(() {
                      _counter = 0;
                    });
                  },
                  child: const Text(
                    'OK',
                  ),
                )
              ],
            );
          },
        );
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Your Future will return result here', style: Theme.of(context).textTheme.bodyLarge),
            const SizedBox(height: 4),
            Text('counter: $_counter', style: Theme.of(context).textTheme.headlineSmall),
            const SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                TextButton(
                  onPressed: () => _onIncrementCounter(
                    context: context,
                    dialogType: DialogType.material,
                  ),
                  child: const Text('Material'),
                ),
                TextButton(
                  onPressed: () => _onIncrementCounter(
                    context: context,
                    dialogType: DialogType.cupertino,
                  ),
                  child: const Text('Cupertino'),
                ),
                TextButton(
                  onPressed: () => _onIncrementCounter(
                    context: context,
                    dialogType: DialogType.adaptive,
                  ),
                  child: const Text('Adaptive'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter进度对话框插件flutter_future_progress_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter进度对话框插件flutter_future_progress_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用flutter_future_progress_dialog插件来显示进度对话框的示例代码。这个插件允许你显示一个进度对话框,同时执行一个异步任务,并在任务完成后关闭对话框。

首先,你需要在你的pubspec.yaml文件中添加这个依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_future_progress_dialog: ^2.0.0  # 请确保版本号是最新的

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Dart文件中使用这个插件。以下是一个完整的示例,展示了如何使用flutter_future_progress_dialog来显示一个进度对话框,并在一个模拟的异步任务完成后关闭它。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Future Progress Dialog Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 创建FutureProgressDialog实例
              final FutureProgressDialog dialog = FutureProgressDialog(context);
              
              // 显示进度对话框
              dialog.ask(
                // 这里传递一个Future,表示异步任务
                () async {
                  // 模拟一个耗时操作,例如网络请求
                  await Future.delayed(Duration(seconds: 3));
                },
                // 成功回调
                onSuccess: (result) {
                  // 这里可以处理成功后的逻辑,result是Future返回的结果
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                    content: Text('任务完成!'),
                  ));
                },
                // 失败回调
                onError: (error, stackTrace) {
                  // 这里可以处理错误逻辑
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                    content: Text('发生错误: $error'),
                  ));
                },
              );
            },
            child: Text('开始任务'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当用户点击按钮时,会显示一个进度对话框,并且会执行一个模拟的异步任务(使用Future.delayed来模拟耗时操作)。任务完成后,进度对话框会自动关闭,并显示一个SnackBar通知用户任务已完成。

这个插件非常适合用于处理需要用户等待的异步操作,如网络请求、文件处理等,可以提供更好的用户体验。

回到顶部