Flutter 状态管理
目前 Flutter 已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求;我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现
譬如目前最为简洁的 get 库,为了实现一些黑科技语法糖,其实现就较为复杂;我们知道一台机器越复杂,可靠性就会降低;道理就如同在一些动乱地区,非常流行一些傻大黑粗的皮卡车,结构简单,皮实耐用
现在 Flutter,最具争议的话题,到目前为止,开发者最关心的问题是选择哪个状态管理选项;老实说,几乎每个状态管理解决方案都会解决这个问题;他们都有自己的细微差别,各有所长
答案就是没有最好的,只有自己最熟悉的一种,可以节省更多时间的才是最合适的
在这里列举了9种顶级状态管理
-
setstate
-
riverpod
-
provider
-
getX
-
get_it
-
bloc
-
rxdart
-
states_rebuilder
-
stacked
setstate
许多人使用大型复杂架构来创建状态管理,但有时候只是在构建一个简单的应用程序;如果应用程序足够简单,则没有理由制作所有这些状态管理解决方案;只需使用 setstate; setstate 的伟大之处在于它很简单,并且不会让代码添加更多依赖项;如果你只有一两个状态,那么你应该使用 setstate
riverpod
riverpod 可以说时目前最棒的状态管理库,因为它很安全;它会在编译代码之前告诉开发者是否会遇到问题。它的作者也是 Provider 的作者,同时也是 Flutter 官方推荐的状态管理库。它具有出色的文档;一个专门介绍 riverpod 及其使用方法和许多示例的完整网站,从这里学到所有需要的东西;现在,riverpod 已经内置了 状态通知器 ;因此,它为提供了一种极好的,不可变(immutable)的方式来控制状态
getX
getX 是为了让 Flutter 开发变得简单;这是最简单的状态管理包之一,但最重要的是它不仅仅是状态管理,但它还有很多其他额外功能,可以称其为中国作者制作的大杂烩包;其主要的三个支柱是路由管理、状态管理和依赖管理;许多 flutter 专家都对这个包的流行非常不满,称其为垃圾,因为他会阻碍开发者了解 flutter 真正的开发内容,强烈建议: 不要使用。
provider
这是 Flutter 推荐的状态管理;它很健壮,并且已经存在了很长时间。基本上任何相关的问题都可以在 StackOverflow 种找到答案
get_it
这是本人最喜欢的状态管理库,强烈推荐;它借鉴于.net , 使用起来不要太爽;在 Flutter package 中名列前茅,超过 1800 like
bloc
我不是 bloc 的忠实粉丝,但是它作为老前辈,2 年前的项目大多都使用这个
rxdart
我仅仅用到了其中很小的功能,但是它作为状态管理先驱,很多开发者真的很喜欢使用它;这也是 Flutter 的最爱
states_rebuilder
在所有不同类型的状态管理中,它使用起来非常简单,我觉得它有很多 Riverpod 的功能;通过 Riverpod 带来的一些重要功能实现了许多重大更新。非常类似于 riverpod
stacked
对于 Android 开发者来说,MVVM 架构太熟悉了,我也是从Android进入 flutter 开发,钟爱 MVVM 架构;因此 stacked 基本每一个项目必用
Flutter 全局变量
对于Android 原生开发而言,在接触 FLutter 之后;首先会考虑在启动的时候创建一个全局变量来保存参数 但是对于dart 语言来说 其实更加简单 多个文件引用同一个文件,其中相关变量就是共享的 新建一个dart 文件里面创建属性变量 对于Android来说 他就是一个全局变量
第一步:
新建一个Dart 他就是我们的全局变量
class Global{
static String textContent = 'nihao';
}
第二步:
应用
class _otherConetnt1State extends State<otherConetnt1> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('OtherPage'),
),
body: Column(
children: <Widget>[
Text(Global.textContent),
GestureDetector(
onTap: () {
// Global.textContent = '我也挺好的';
setState(() {
Global.textContent = '我也挺好的';
});
},
child: Text(
"点击变一变",
style: TextStyle(fontSize: 20),
),
),
],
),
);
}
}
共享可变变量
官方提供的例子由于是用 final 修饰的,因此子控件不能够改变其值,如果想要创建一个可变得变量,就可以用到我们一开始提到的 state,在 InheritedWidget 中保存一个 StatefulWidget,就可以通过这个 StatefulWidget 来管理要保存的变量了:
代码如下:
class _SharedInherited extends InheritedWidget {
_SharedInherited({
Key key,
@required Widget child,
@required this.data,
}) : super(key: key, child: child);
final SharedInheritedWidgetState data; //通过一个StatefulWidgetState来保存数据
@override
bool updateShouldNotify(_SharedInherited oldWidget) { //数据更新
return data != oldWidget.data;
}
}
class SharedInheritedWidget extends StatefulWidget {
SharedInheritedWidget({
Key key,
this.child,
}) : super(key: key);
final Widget child;
@override
SharedInheritedWidgetState createState() =>
new SharedInheritedWidgetState();
static SharedInheritedWidgetState of(BuildContext context) {
return (context.inheritFromWidgetOfExactType(_SharedInherited)
as _SharedInherited)
.data;
}
}
class SharedInheritedWidgetState extends State<SharedInheritedWidget> {
String _sharedVal = ''; //共享变量
void setSharedVal(String newVal) {
setState(() {
_sharedVal = newVal;
});
}
String getSharedVal() {
return _sharedVal;
}
@override
Widget build(BuildContext context) {
return _SharedInherited(child: widget.child, data: this);
}
}
上边分析了那么多, 看了那么一大堆的代码,我们清楚的了解到了 Flutter 状态管理的重要性了
好了,以上就是今天要分享的内容,大家觉得有用的话,可以点赞分享一下;如果文章中有什么问题欢迎大家指正;欢迎在评论区或后台讨论哈~