Flutter | 关于状态管理,别再被吓着了

简介: 本篇是带大家了解并明白 Flutter 中状态管理相关,着眼与实际应用与通俗(说人话)解释,杜绝概念连篇 ❎ 。

导航

本篇是带大家了解并明白 Flutter状态管理相关,着眼与实际应用与通俗(说人话)解释,杜绝概念连篇 ❎ 。

概述

响应式的编程框架中总会有一个永恒的主题–”状态管理“,无论是 React/Vue(前端开发同学肯定了解),还是 Flutter,为了便于共享组件之间的状态,便于在特定时候干特定操作,都会遵循一些特定的约束,而这个约束的过程我们称它为状态管理。

注意,这里的widget或者组件可以理解为Android中的View.

对于一个组件,我们可能有好多种响应状态,比如手势的按下时,手势放开时,这些不同的状态下,我们的组件可能会做出一些改变,而作为开发者我们怎么知道它们改变了呢?就是定义一些状态变量去判断,而这些状态变量是由当前 widget 自己持有并管理好呢,还是自己只是做一个接收判断,具体还是由父 Widget ( Android 开发者你可以理解为调用者传递进来)管理呢,具体都是根据实际情况而定。而上述的这个过程我们就可以称之为 状态管理。

Flutter的状态管理

Flutter 中,我们都知道 StatefuleWidget 对应可变组件,那么相应的,它的一些状态应该被谁管理?Widget本身?父Widget?还是都行呢?

最佳解决方式是:

根据实际情况而定。

你可以认为这就是状态管理的基本宗旨,在知道宗旨情况下,我们下面来看看 Flutter 究竟如何管理。

常见的状态管理方式

  • Widget 管理自己的状态
  • Widget 管理子 Widget 的状态
  • 混合管理(子 Widget 和父 Widget 都管理状态)

如何决定使用哪种管理方法,下面是官方给出的一些原则以便更准确的做出选择:

  • 如果状态是用户数据,如复选框的选中状态,滑块的位置,则该状态最好是由父Widget管理;
  • 如果状态是有关界面外观效果的,例如颜色、动画,那么状态最好是由Widget本身来管理;
  • 如果某一个状态是不同 Widget 共享的则最好是由他们共同的父Widget管理。

往往在Widget内部管理状态封装性会比较好,而在父 Widget 中管理会比较灵活,有些时候,如果不确定到底该怎么去管理,那么推荐的首选是在 父widget中管理会显得更为灵活。

实践环节

1. widget自己管理自己

比如我们有如下一个示例,当我们点击屏幕时,相应的小方块改变颜色和内容, 因为要做到屏幕任意位置点击都可以触发,所以我们选用 GestureDetector 手势管理组件。


在这个示例中,我们没有太多操作,就是单纯改变文字显示与颜色,所以对于如何显示的这个判断,我们很简单就会定义一个变量,然后在相应的状态下执行相应不同的处理方式即可。

你可能会有疑问,为什么这么麻烦,的确好像看起来麻烦,我们在Android开发中,通常会直接更新view,相应的,在Flutter中,我们更新一个 Widget ,只需要 setState,然后我们的 Widget 会重新构建,如果以一个 Android 开发的思想,我们将这个状态变量提出来,你会发现你和 Flutter 好像做的也并无区别,但为什么 Flutter 的这种写法反而更为简洁呢.

请记住,Flutter 中的 **Stateful **与 Stateless Widget 区分为,有状态信息与无状态信息的两个 widget , 对于一个组件(StateFul)而言,它的不同状态决定了它 最终 的显示,而在 Android 上,这个所谓的状态仅仅只是影响了view当前 的一个显示。


具体示例如下:


动画 代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|

2. 父Widget管理子Widget状态

有些时候,可能某个widget状态 需要在父 widget 地方也用到时,这个时候就可以通过下述方式来实现,即间接的通过父 widget 管理了我们子 widget 的状态。


示例如下:


动画 代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|

3. 混合管理

有些情况下,我们可能会配合使用,比如下面示例中,手指按下时,我们屏幕中间小方块周围出现一个深红色边框,抬起时,边框消失,点击完成后,方块的颜色改变。

我们在父 Widget 管理红色边框是否显示,在子Widget控制小方块的颜色改变。

具体示例如下:

动画效果 父Widget 子Widget


目录
相关文章
|
13天前
|
存储 Shell 开发工具
Flutter&鸿蒙next 中使用 MobX 进行状态管理
本文介绍了如何在 Flutter 中使用 MobX 进行状态管理。MobX 是一个基于观察者模式的响应式编程库,通过 `@observable` 和 `@action` 注解管理状态,并使用 `Observer` 小部件自动更新 UI。文章详细讲解了 MobX 的核心概念、如何集成到 Flutter 项目中以及具体的代码示例。适合希望在 Flutter 应用中实现高效状态管理的开发者阅读。
85 9
|
13天前
|
存储 开发者
Flutter&鸿蒙next 使用 BLoC 模式进行状态管理详解
本文详细介绍了如何在 Flutter 中使用 BLoC 模式进行状态管理。BLoC 模式通过将业务逻辑与 UI 层分离,利用 Streams 和 Sinks 实现状态管理和 UI 更新,提高代码的可维护性和可测试性。文章涵盖了 BLoC 的基本概念、实现步骤及代码示例,包括定义 Event 和 State 类、创建 Bloc 类、提供 Bloc 实例以及通过 BlocBuilder 更新 UI。通过一个简单的计数器应用示例,展示了 BLoC 模式的具体应用和代码实现。
67 1
|
15天前
|
开发工具 开发者
Flutter&鸿蒙next 状态管理高级使用:深入探讨 Provider
本文深入探讨了 Flutter 中 Provider 的高级用法,涵盖多 Provider 组合、Selector 优化性能、ChangeNotifierProxyProvider 管理依赖关系以及自定义 Provider。通过这些技巧,开发者可以构建高效、可维护的响应式应用。
62 2
|
27天前
|
开发工具 开发者
Flutter&鸿蒙next 状态管理高级使用:深入探讨 Provider
Flutter&鸿蒙next 状态管理高级使用:深入探讨 Provider
|
13天前
|
缓存 JavaScript API
Flutter&鸿蒙next 状态管理框架对比分析
在 Flutter 开发中,状态管理至关重要,直接影响应用的性能和可维护性。本文对比分析了常见的状态管理框架,包括 setState()、InheritedWidget、Provider、Riverpod、Bloc 和 GetX,详细介绍了它们的优缺点及适用场景,并提供了 Provider 的示例代码。选择合适的状态管理框架需考虑应用复杂度、团队熟悉程度和性能要求。
81 0
|
27天前
【Flutter】状态管理:Provider状态管理
【Flutter】状态管理:Provider状态管理
14 0
|
1月前
|
UED
flutter:动画&状态管理 (十三)
本文档介绍了Flutter中`animatedList`的使用方法和状态管理的示例。`animatedList`用于创建带有动画效果的列表,示例代码展示了如何添加、删除列表项,并执行相应的动画效果。状态管理部分通过一个简单的点击切换颜色的示例,演示了如何在Flutter中管理组件的状态。
|
3月前
Flutter 状态管理新境界:多Provider并行驱动UI
Flutter 状态管理新境界:多Provider并行驱动UI
62 0
|
3月前
|
Dart API
状态管理的艺术:探索Flutter的Provider库
状态管理的艺术:探索Flutter的Provider库
47 0
|
4月前
|
容器
flutter 布局管理【详解】
flutter 布局管理【详解】
38 3