当前位置: 首页 > article >正文

Flutter控件FutureBuilder控件详解

在这里插入图片描述

文章目录

      • 1. `FutureBuilder` 的定义
        • 构造函数:
        • 参数详解:
      • 2. `AsyncSnapshot` 的状态
        • 状态属性:
      • 3. 基本用法
      • 4. 深入解析
        • 1. 动态更新 UI
        • 2. 初始数据
        • 3. 错误处理
      • 5. 实用场景
      • 6. 注意事项

FutureBuilder 是 Flutter 中一个非常强大的控件,专门用于处理异步数据加载。它根据 Future 的状态动态地构建 UI,例如正在加载、加载完成以及加载出错等状态。


1. FutureBuilder 的定义

FutureBuilder 是一个基于 Future 的状态来构建其子控件的 Widget。

构造函数:
FutureBuilder<T>({
  required Future<T>? future,
  required AsyncWidgetBuilder<T> builder,
  T? initialData,
})
参数详解:
  • future: 一个异步计算的 FutureFutureBuilder 将基于这个 Future 的状态构建 UI。如果 futurenullFutureBuilder 将不会触发任何构建。
  • builder: 构建函数,接收 BuildContextAsyncSnapshot<T> 参数,返回一个 Widget。
  • initialData: 初始数据,在 Future 还未完成前,builder 中的 snapshot.data 会返回该值。

2. AsyncSnapshot 的状态

AsyncSnapshotFutureBuilder 的核心,它表示异步操作的当前状态和数据。

状态属性:
  • connectionState: 表示 Future 的连接状态:
    • ConnectionState.none:还未开始任何异步操作。
    • ConnectionState.waitingFuture 正在等待,异步操作未完成。
    • ConnectionState.activeFuture 正在活动中(很少用于 FutureBuilder,通常用于 StreamBuilder)。
    • ConnectionState.doneFuture 完成,无论是成功还是失败。
  • hasData: snapshot.data 是否有值。
  • hasError: 是否有错误,若有,snapshot.error 提供错误信息。
  • data: 返回加载完成后的数据。
  • error: 返回发生的错误。

3. 基本用法

以下是一个完整的 FutureBuilder 示例,模拟一个从网络获取数据的操作:

import 'package:flutter/material.dart';
import 'dart:async'; // For Future

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureBuilderDemo(),
    );
  }
}

class FutureBuilderDemo extends StatelessWidget {
  // 模拟异步获取数据的方法
  Future<String> fetchData() async {
    await Future.delayed(Duration(seconds: 2)); // 模拟网络延迟
    return "Hello, FutureBuilder!";
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('FutureBuilder Demo')),
      body: Center(
        child: FutureBuilder<String>(
          future: fetchData(), // 异步操作
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator(); // 显示加载中指示器
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}'); // 显示错误信息
            } else if (snapshot.hasData) {
              return Text('Data: ${snapshot.data}'); // 显示加载成功的数据
            } else {
              return Text('No data available');
            }
          },
        ),
      ),
    );
  }
}

4. 深入解析

1. 动态更新 UI

future 的状态发生变化时(比如等待 -> 完成),FutureBuilder 会自动重新调用 builder 方法构建新的 UI。

2. 初始数据

可以通过 initialData 提供一个默认值,在异步操作完成之前显示。例如:

FutureBuilder<String>(
  future: fetchData(),
  initialData: 'Loading...',
  builder: (context, snapshot) {
    return Text(snapshot.data ?? 'No data');
  },
)
3. 错误处理

在异步操作中捕获异常时,FutureBuilder 会将其传递到 snapshot.error 中,可以在 builder 中显示自定义的错误 UI。


5. 实用场景

  1. 网络请求:
    • 从 API 获取数据,并根据加载状态显示不同的 UI。
  2. 文件加载:
    • 加载本地文件,如读取配置文件或 JSON 数据。
  3. 数据库查询:
    • 从 SQLite 或其他数据库中获取数据。
  4. 异步计算:
    • 执行耗时的计算任务并显示结果。

6. 注意事项

  1. future 不要重复执行:

    • 如果 future 每次都生成新的实例,会导致 FutureBuilder 重复构建。
    • 解决方案:将 Future 存储到变量中。
    late Future<String> _future;
    
    
    void initState() {
      super.initState();
      _future = fetchData(); // 避免重复执行
    }
    
    
    Widget build(BuildContext context) {
      return FutureBuilder(
        future: _future,
        builder: (context, snapshot) => ...
      );
    }
    
  2. 错误处理要全面:

    • 确保对 snapshot.error 进行检查,防止未处理的异常。
  3. 适用于一次性任务:

    • FutureBuilder 更适合于一次性异步任务。如果需要持续更新的异步数据流,推荐使用 StreamBuilder

FutureBuilder 是一个灵活而实用的工具,非常适合处理异步任务并动态更新 UI。通过合理设计和管理 Future,可以大幅提升 Flutter 应用的响应性和用户体验。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!


http://www.kler.cn/a/444078.html

相关文章:

  • 随手记:小程序兼容后台的wangEditor富文本配置链接
  • ChatGPT生成接口文档的方法与实践
  • 基础爬虫案例实战
  • 有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?
  • [LeetCode-Python版] 定长滑动窗口1(1456 / 643 / 1343 / 2090 / 2379)
  • 小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书
  • uniapp使用百度地图配置了key,但是显示Map key not configured
  • Unity 根据文本宽度自动移动图像位置
  • thinkphp5命令行,addOption和addArgument有什么区别
  • 51c自动驾驶~合集41
  • 受限前缀注意机制的事件关系识别
  • Spark-Streaming性能调优
  • el-date-picker筛选时间日期选择范围
  • 解决安装Weditor提示GBK编码格式问题
  • pytest入门十:配置文件
  • 网络地址转换(NAT)和端口映射
  • 算法12、基础二分查找的运用(旋转数组专题)
  • 【bWAPP】XSS跨站脚本攻击实战
  • Springboot导出Excel方法(若依实例)
  • HTML5技术深度解析与实战应用
  • 网络安全(3)_安全套接字层SSL
  • 1 数据库(中):DDL(数据库设计)、DML(增删改表中数据)、DQL(查询表中数据)单表基本语法
  • Vue前端开发-axios默认配置和响应结构
  • Python机器学习笔记(七、深度学习-神经网络)
  • Cocos Creator 试玩广告开发
  • Vue 2 中 v-html 指令的使用详解