如何在 Flutter 中实现加载对话框

举报
坚果的博客 发表于 2022/03/15 08:33:19 2022/03/15
【摘要】 今天又是一篇日常水文,如何在 Flutter 中实现加载对话框作者:坚果公众号:"大前端之旅"华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体验官,开源项目GVA成员之一,专注于大前端技术的分享,包括Flutter,鸿蒙,小程序,安卓,VUE,JavaScript。本文将向您展示如何在 Flutter 中从头开始创建加载对话框。概述有很多场景需要你执行异步计算(futu...

今天又是一篇日常水文,如何在 Flutter 中实现加载对话框

作者:坚果

公众号:"大前端之旅"

华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体验官,开源项目GVA成员之一,专注于大前端技术的分享,包括Flutter,鸿蒙,小程序,安卓,VUE,JavaScript。

本文将向您展示如何在 Flutter 中从头开始创建加载对话框。

概述

有很多场景需要你执行异步计算(future),比如发出 HTTP 请求、处理文件、从本地数据库获取数据等。因为 future 不能立即提供结果,所以用户必须等待一段时间. 在这种情况下,我们可以显示一个加载对话框,让他或她知道发生了什么。加载对话框的另一个好处是它可以防止用户在未来尚未完成时与应用程序交互(编辑文本字段、点击按钮或类似的东西)。

在 Flutter 中,当用户点击对话框之外的某个位置时,可以手动关闭普通对话框。但是,加载对话框不应该这样关闭。它应该只在未来结束时自动消失。像这样:

// show the loading dialog
showDialog(
        // The user CANNOT close this dialog  by pressing outsite it
        barrierDismissible: false,
        context: context,
        builder: (_) {
          return Dialog(
            /*
            put a CircularProgressIndicator() here
            */
          );
       }
);
​
// the future
await someFuture();
​
// close the dialog automatically
 Navigator.of(context).pop();

为了更清楚,请参阅下面的完整示例。

例子

chip

我们要构建的小应用程序在屏幕中央有一个按钮。按下按钮时,将显示一个加载对话框。3 秒后,加载对话框将自动消失。

代码

// main.dart
import 'package:flutter/material.dart';
​
void main() {
  runApp(const MyApp());
}
​
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        // 删除调试banner
        debugShowCheckedModeBanner: false,
        title: '大前端之旅',
        theme: ThemeData(
          primarySwatch: Colors.indigo,
        ),
        home: const HomePage());
  }
}
​
class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);
​
  void _fetchData(BuildContext context) async {
    // show the loading dialog
    showDialog(
        // 用户无法通过在外部按下此对话框来关闭它
        barrierDismissible: false,
        context: context,
        builder: (_) {
          return Dialog(
            // The background color
            backgroundColor: Colors.white,
            child: Padding(
              padding: const EdgeInsets.symmetric(vertical: 20),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: const [
                  // The loading indicator
                  CircularProgressIndicator(),
                  SizedBox(
                    height: 15,
                  ),
                  // Some text
                  Text('Loading...')
                ],
              ),
            ),
          );
        });
​
    // 您在这里进行相关操作(从 API 获取数据、处理文件、向数据库插入内容等)
    await Future.delayed(const Duration(seconds: 3));
​
    // 以编程方式关闭对话框
    Navigator.of(context).pop();
  }
​
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('大前端之旅')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => _fetchData(context),
          child: const Text('Load Data'),
        ),
      ),
    );
  }
}
​

结论

您已经学习了如何使用 Flutter 提供的原生组件制作加载对话框。不需要第三方包。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。