跨平台APP开发Flutter ListView 局部刷新数据、ListView点赞收藏

简介: 本文章实现的是 ListView 中 Item 局部数据刷新的效果,在这只是一个 Demo ,是一个实现思路,在应用开发的更多场景中如 资讯列表的点赞、收藏等等,诸多业务场景都可使用。

题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。


Flutter是谷歌推出的最新的移动开发框架。

【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过

【x2】各种系列的视频教程 免费开源 关注 你不会迷路

【x3】系列文章 百万 Demo 随时 复制粘贴 使用


本文章实现的是 ListView 中 Item 局部数据刷新的效果,如下图所示。

在这里插入图片描述
在这只是一个 Demo ,是一个实现思路,在应用开发的更多场景中如 资讯列表的点赞、收藏等等,诸多业务场景都可使用。

1 Demo 实现

首先是这里使用列表使用到的数据模型定义如下:完整源码

///ListView 测试数据 Model
class TestBean {
  String name;
  bool isCollect;

  TestBean({this.name, this.isCollect});
}

然后就是 ListView 实现的主页面,定义如下:

///ListView 局部数据更新使用 Demo
class TestListPartPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _TestABPageState();
  }
}

class _TestABPageState extends State {
  ///测试数据集合
  List<TestBean> _testList = [];

  @override
  void initState() {
    super.initState();
    ///模拟测试数据
    for (int i = 0; i < 100; i++) {
      _testList.add(TestBean(name: "测试数据 $i", isCollect: false));
    }
  }

  @override
  Widget build(BuildContext context) {
    ///页面主体脚手架
    return Scaffold(
      appBar: AppBar(
        title: Text("ListView 局部数据更新 "),
      ),
      body: buildListView(),
    );
  }

  ///构建一个列表 ListView
  buildListView() {
    ///懒加载模式构建
    return ListView.builder(
      ///子Item的构建器
      itemBuilder: (BuildContext context, int index) {
        ///每个子Item的布局
       ///在这里是封装到了独立的 StatefulWidget
        return TestListItemWidget(
          ///子Item对应的数据
          bean: _testList[index],
          ///可选参数 子Item标识
          key: GlobalObjectKey(index),
        );
      },
      ///ListView子Item的个数
      itemCount: _testList.length,
    );
  }
}

每个子 Item 的UI布局及功能封装成了一个 独立的 StatefulWidget,代码如下:

///ListView 的子Item
class TestListItemWidget extends StatefulWidget {
  ///本Item对应的数据模型
  final TestBean bean;

  TestListItemWidget({@required this.bean, Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _ListItemState();
  }
}
class _ListItemState extends State<TestListItemWidget> {
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Container(
        color: Colors.grey[300],
        padding: EdgeInsets.only(
          top: 5,
          bottom: 5,
        ),
        child: Container(
          padding: EdgeInsets.only(
            left: 15,
            right: 15,
          ),
          color: Colors.white,
          height: 60,
          child: buildRow(),
        ),
      ),
    );
  }

  ///内容区域
  Row buildRow() {
    ///左右线性排开
    return Row(
      children: [
        ///权重布局 文本占用空白区域
        Expanded(
            child: Text(
          "${widget.bean.name}",
        )),
        ///收藏按钮
        RaisedButton(
          ///按钮的背景
          color: widget.bean.isCollect ? Colors.blue : Colors.grey[200],
          ///点击更新当前 Item 数据以及刷新页面显示
          onPressed: () {
            setState(() {
              widget.bean.isCollect = !widget.bean.isCollect;
            });
          },
          child: Text(
            "${widget.bean.isCollect ? '已收藏' : '收藏'}",
            style: TextStyle(
                color: widget.bean.isCollect ? Colors.white : Colors.red),
          ),
        ),
      ],
    );
  }
}

2 原理分析

很多个为什么,咱们一一来分析,大家如果有疑问或者不同的看法,可以回复评论,一起优化

2.1 实现的真的是局部刷新吗 ?

答案为 是的,在这里模拟了100条数据,但是这里使用的是懒加载模式构建的,所以实际绘制出来的 Item 并不是 100 条,如下图所示:
在这里插入图片描述
滑动时,滑出屏幕外的,超出ListView缓存区域的就会被销毁,在本 Demo 本测试模拟器中,ListView中始终是绘制的 16 个子 Item。

ListView 每一个子 Item 都是一个独立的 StatefulWidget ,都对应的是一个 独立的 State ,所以调用 setState方法来刷新只是刷新了当前的 StatefulWidget 内容区域,当然从源码角度也有另外的解读,这里不去说源码。

当然在实际业务场景中,你的 ListView 中的 Item的UI布局功能可能足够的复杂,不用担心 ,你也可以采用这种思路 ,把每个 Item 中的 部分 Widget 再次封装到不同的StatefulWidget 中,这样也能实现ListView 中一个Item中不同的Widget 刷新不同的区域。

当然 也可以在 ListView 的Item 中使用 Stream 、Provider 、BloC等等,小编这里也有说明点击查看

2.2 状态如何保存的 ???

通过数据模型来保存的状态,因为在这里使用的是根据 TestBean 中 isCollect 的值来构建不同的样式的,List中保存的 TestBean 的标识不同,构建的子Item的样式不同。

2.3 List 中的数据是如何更新的 ???

还是这一句更新的:

   setState(() {
     widget.bean.isCollect = !widget.bean.isCollect;
   });

效果同下

   ///修改数据
   widget.bean.isCollect = !widget.bean.isCollect;
   ///刷新页面显示
   setState(() {  });

在这一步修改数据,看下图你就明白了

在这里插入图片描述
ListView 的子Item 中(TestListItemWidget)使用的数据模型在内存区域中还是在 TestListPartPage 这里创建的 _testList 集合中保存的对象实体,整个过程中只是通过指针索引来绑定数据,修改数据实际上修改的还是同一块内存区域中的数据。


完毕

以小编的性格,要实现百万Demo随时复制粘贴肯定是需要源码的 github 完整源码 点击查看

当然以小编的性格,肯定是要有视频录制的,目前正在录制中,你可以关注一下 西瓜视频 --- 早起的年轻人 随后会上传

相关文章
|
26天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
105 4
|
27天前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
54 10
|
2月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
26天前
|
开发框架 Dart 前端开发
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。本文从 Flutter 简介、特点、开发环境搭建、应用架构、组件详解、路由管理、状态管理、与原生代码交互、性能优化、应用发布与部署及未来趋势等方面,全面解析 Flutter 技术,助你掌握这一前沿开发工具。
56 8
|
26天前
|
存储 JavaScript 前端开发
在Flutter开发中,状态管理至关重要。随着应用复杂度的提升,有效管理状态成为挑战
在Flutter开发中,状态管理至关重要。随着应用复杂度的提升,有效管理状态成为挑战。本文介绍了几种常用的状态管理框架,如Provider和Redux,分析了它们的基本原理、优缺点及适用场景,并提供了选择框架的建议和使用实例,旨在帮助开发者提高开发效率和应用性能。
34 4
|
26天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
39 2
|
1月前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
76 8
|
1月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
113 1
|
2月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
103 3
|
1月前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
228 0