首页 > 其他分享 >Flutter基础组件(9):Progress(进度条)

Flutter基础组件(9):Progress(进度条)

时间:2024-11-25 10:46:28浏览次数:6  
标签:valueColor 进度条 Colors backgroundColor CircularProgressIndicator Progress LinearP

在 Flutter 应用开发中,无论是处理网络请求,执行耗时任务,或是等待用户响应,我们总是需要在界面上显示进度条或者等待指示器。在这篇博客中,我们将介绍 Flutter 中两种常用的进度指示器:LinearProgressIndicatorCircularProgressIndicator。我们将比较它们的异同点,以及如何使用和自定义它们。

一、LinearProgressIndicator和CircularProgressIndicator的异同点

相同点:

  • 都是进度指示器,用于在应用执行某项任务时提供视觉反馈。
  • 都可以设置为确定的进度模式(显示当前进度)和不确定的进度模式(表示任务正在进行,但具体进度未知)。

不同点:

  • 形状不同:LinearProgressIndicator是线性的,水平显示,而CircularProgressIndicator是圆形的,类似于加载旋转轮。
  • 由于形状的差异,两者在空间使用上有所不同,LinearProgressIndicator通常用于宽度更大的空间,而CircularProgressIndicator则适用于任何方向的空间。

两者的使用和效果对比

在开始介绍如何使用这两个组件之前,我们先看一下他们的效果。以下是一个简单的 Flutter 应用,其中包含一个LinearProgressIndicator和一个CircularProgressIndicator

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(title: const Text('Progress Indicators')),
        body: const Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              LinearProgressIndicator(),
              CircularProgressIndicator(),
            ],
          ),
        ),
      ),
    ),
  );
}

在这个例子中,我们将两个进度指示器放置在屏幕的中央。当你运行这个程序时,你会看到一个水平的进度条和一个旋转的圆形进度指示器。效果图如下所示:

Flutter_progress_G.png


二、LinearProgressIndicator

LinearProgressIndicator的主要参数有:

  • value:一个介于 0.0 和 1.0 之间的数字,表示进度。当值为null时,进度指示器将进入不确定的模式,显示一个循环动画。
  • backgroundColor:进度条的背景颜色。
  • valueColor:进度条的颜色。通常与AlwaysStoppedAnimation<Color>一起使用。

示例:

// 模糊进度条(会执行一个动画)
LinearProgressIndicator(
  backgroundColor: Colors.grey[200],
  valueColor: AlwaysStoppedAnimation(Colors.blue),
),
// 进度条显示50%
LinearProgressIndicator(
  value: 0.5,  // 进度值,0.5表示50%
  backgroundColor: Colors.grey[200],  // 进度条的背景颜色
  valueColor: AlwaysStoppedAnimation(Colors.blue),  // 进度条的颜色
)

第一个进度条在执行循环动画:蓝色条一直在移动,而第二个进度条是静止的,停在50%的位置。效果图如下所示:

Flutter_progress_A.png


三、CircularProgressIndicator

CircularProgressIndicator是一个圆形进度条,定义如下:

 CircularProgressIndicator({
  double value,
  Color backgroundColor,
  Animation<Color> valueColor,
  this.strokeWidth = 4.0,
  ...   
}) 

CircularProgressIndicator的主要参数和LinearProgressIndicator相似,它也有valuebackgroundColorvalueColor,不再赘述。strokeWidth表示圆形进度条的粗细。示例如下:

// 模糊进度条(会执行一个旋转动画)
CircularProgressIndicator(
  backgroundColor: Colors.grey[200],
  valueColor: AlwaysStoppedAnimation(Colors.blue),
),
// 进度条显示50%,会显示一个半圆
CircularProgressIndicator(
  backgroundColor: Colors.grey[200],
  valueColor: AlwaysStoppedAnimation(Colors.blue),
  value: .5,
),

运行效果如下图所示:

Flutter_progress_B.png


第一个进度条会执行旋转动画,而第二个进度条是静止的,它停在 50% 的位置。

四、自定义进度指示器样式

LinearProgressIndicator(
  value: _progressValue, // 当前进度值
  backgroundColor: Colors.grey[300], // 背景颜色
  color: Theme.of(context).primaryColor, // 前景色
)

CircularProgressIndicator(
  value: _progressValue, // 当前进度值
  backgroundColor: Colors.grey[200], // 背景颜色
  valueColor: AlwaysStoppedAnimation<Color>(Colors.blue), // 前景色
  strokeWidth: 4.0, // 线宽
)

五、自定义尺寸

我们可以发现LinearProgressIndicatorCircularProgressIndicator,并没有提供设置圆形进度条尺寸的参数;如果我们希望LinearProgressIndicator的线细一些,或者希望CircularProgressIndicator的圆大一些该怎么做?

其实LinearProgressIndicatorCircularProgressIndicator都是取父容器的尺寸作为绘制的边界的。知道了这点,我们便可以通过尺寸限制类Widget,如ConstrainedBoxSizedBox (我们将在后面容器类组件一章中介绍)来指定尺寸,如:

// 线性进度条高度指定为3
SizedBox(
  height: 3,
  child: LinearProgressIndicator(
    backgroundColor: Colors.grey[200],
    valueColor: AlwaysStoppedAnimation(Colors.blue),
    value: .5,
  ),
),
// 圆形进度条直径指定为100
SizedBox(
  height: 100,
  width: 100,
  child: CircularProgressIndicator(
    backgroundColor: Colors.grey[200],
    valueColor: AlwaysStoppedAnimation(Colors.blue),
    value: .7,
  ),
),

运行效果如下图所示:

Flutter_progress_D.png


注意,如果CircularProgressIndicator显示空间的宽高不同,则会显示为椭圆。如:

// 宽高不等
SizedBox(
  height: 100,
  width: 130,
  child: CircularProgressIndicator(
    backgroundColor: Colors.grey[200],
    valueColor: AlwaysStoppedAnimation(Colors.blue),
    value: .7,
  ),
),

运行效果如下图所示:

Flutter_progress_E.png


六、进度色动画

前面说过可以通过valueColor对进度条颜色做动画,关于动画我们将在后面专门的章节详细介绍,这里先给出一个例子,读者在了解了Flutter动画一章后再回过头来看。

我们实现一个进度条在3秒内从灰色变成蓝色的动画:

import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Scaffold(
      body: ProgressRoute(),
    )
  ));
}

class ProgressRoute extends StatefulWidget {
  const ProgressRoute({super.key});
  @override
  State<ProgressRoute> createState() => _ProgressRouteState();    
}

class _ProgressRouteState extends State<ProgressRoute>
  with SingleTickerProviderStateMixin {
  late AnimationController _animationController;

  @override
  void initState() {
    //动画执行时间3秒  
    _animationController = AnimationController(
        vsync: this, //注意State类需要混入SingleTickerProviderStateMixin(提供动画帧计时/触发器)
        duration: const Duration(seconds: 3),
      );
    _animationController.forward();
    _animationController.addListener(() => setState(() => {}));
    super.initState();
  }

  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
            Padding(
            padding: const EdgeInsets.all(16),
            child: LinearProgressIndicator(
              backgroundColor: Colors.grey[200],
              valueColor: ColorTween(begin: Colors.grey, end: Colors.blue)
                .animate(_animationController), // 从灰色变成蓝色
              value: _animationController.value,
            ),
          )
        ],
      ),
    );
  }
}

标签:valueColor,进度条,Colors,backgroundColor,CircularProgressIndicator,Progress,LinearP
From: https://www.cnblogs.com/linuxAndMcu/p/18567109

相关文章

  • scratch二次开发:blockly工作区垃圾桶和进度条的隐藏和显示
    大家好,我是小黄。本期给大家介绍的内容是实现blockly工作区的垃圾桶和进度条的显示和隐藏实现。本次基于的项目源码大家可以关注小黄回复垃圾桶自行获取。一.垃圾桶的显示和实现。在blockly中,我们进行块的删除的时候最常用的两种方法是:1.将块拖到toolbox中删除。2.一种......
  • flutter 专题十二 Flutter Fair逻辑动态化架构设计与实现
    数据逻辑处理布局中的逻辑处理Flutter类型数据处理一、数据逻辑处理我们接触的每一个Flutter界面,大多由布局和逻辑相关的代码组成。如Flutter初始工程的CountingDemo的代码:class_MyHomePageStateextendsState<MyHomePage>{//变量int_counter=0;//......
  • flutter的custompaint组件示例6
    这段代码是一个Flutter应用程序,它创建了一个动态的艺术效果,其中包含随机颜色的点在屏幕上不断更新位置。import'package:flutter/material.dart';import'dart:math';voidmain(){runApp(MyApp());}classMyAppextendsStatelessWidget{@overrideWidget......
  • flutter的custompaint组件示例5
    这段代码是一个简单的Flutter应用程序,它创建了一个可拖动的自定义圆角矩形组件。import'package:flutter/material.dart';voidmain(){runApp(MyApp());}classMyAppextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){return......
  • Flutter音频处理
    sampleSizeInBits每个样本的位数每个样本的位数(sampleSizeInBits)指的是在音频信号中,每个样本的位深度,也就是每个音频样本的数字表示所使用的位数。这一参数直接影响音频的动态范围和音质。常用的为8位16位24位32位1.位深度(SampleSize)8位:每个样本用8位二进制表示,值......
  • Flutter路由管理
    前言这篇文章我通过页面跳转、路由传参、命名路由、路由生成钩子的顺序从简入深的说明Flutter的路由。想要了解Flutter的路由就要了解MaterialPageRoute和NavigatorMaterialPageRouteMaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一......
  • Flutter 获取设备网络类型
    前言现在有一个需求,需要能够知道手机端网络类型,如果是WiFi则去使用局域网通信。在这里我选用了connectivity_plus这个库connectivity_plus的平台支持安卓iOS系统苹果系统网络Linux视窗✅✅✅✅✅✅connectivity_plus的APIAPI描述checkConnectivity检查......
  • Excel表格中设置数据进度条注意事项
    首先是操作方法,附步骤:①选中需要进度条显示的单元格,点击开始②选择条件格式--数据条,然后选择样式,个人感觉实心填充效果图更好看。③然后数据条效果就设置完成注意事项,数据条规则要设置最大值和最小值,否则就会出现一组数据中未达到100%但单元格底色被填充满的现象。操作方......
  • Flutter功能性组件(1):对话框
    Material库提供了三种基本对话框组件AlertDialog通常用于提示型对话框SimpleDialog通常用于列表型对话框Dialog通常用于自定义布局元素的对话框弹出对话框时,调用showDialog函数,将对话框控件传入,由于对话框本身是路由,所以关闭对话框时,需使用Navigator.of(context).pop......
  • Flutter基础组件(7):进度条
    在Flutter应用开发中,无论是处理网络请求,执行耗时任务,或是等待用户响应,我们总是需要在界面上显示进度条或者等待指示器。在这篇博客中,我们将介绍Flutter中两种常用的进度指示器:LinearProgressIndicator和CircularProgressIndicator。我们将比较它们的异同点,以及如何使用和自......