九种顶级状态管理带你打开 Flutter 成神之门

1,773 阅读5分钟

Flutter 状态管理

目前 Flutter 已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求;我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现

譬如目前最为简洁get 库,为了实现一些黑科技语法糖,其实现就较为复杂;我们知道一台机器越复杂可靠性就会降低;道理就如同在一些动乱地区,非常流行一些傻大黑粗的皮卡车,结构简单,皮实耐用

现在 Flutter,最具争议话题,到目前为止,开发者最关心的问题是选择哪个状态管理选项;老实说,几乎每个状态管理解决方案都会解决这个问题;他们都有自己的细微差别各有所长

答案就是没有最好的,只有自己最熟悉的一种,可以节省更多时间的才是最合适的

在这里列举了9种顶级状态管理

  1. setstate

  2. riverpod

  3. provider

  4. getX

  5. get_it

  6. bloc

  7. rxdart

  8. states_rebuilder

  9. 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 状态管理的重要性了

好了,以上就是今天要分享的内容,大家觉得有用的话,可以点赞分享一下;如果文章中有什么问题欢迎大家指正;欢迎在评论区或后台讨论哈~