React 生态里广为人知的 Redux 状态管理,其实在 Flutter 中也能适用,它能很好的处理单一数据和状态共享,在一定程度上对于分割项目之间复杂的业务有一定的积极作用,可阅读可维护也能做的很不错。对于使用过 React 的前端开发来说 Redux 的概念肯定熟记于心了,不过我还是要简单说一些东西,只有这样我们才能更好的进入下一个环节。

Redux 主要由三个部分组成:Store,Action,Reducer

  • Action 用于定义数据变化的行为(至少在语义上我们应该定义明确的行为)
  • Reducer 用于根据 Action 来产生新的状态
  • Store 用于存储和管理 state

这个项目的 Redux 例子使用了如下两个 package:

  • https://github.com/brianegan/flutter_redux
  • https://github.com/brianegan/flutter_redux_dev_tools

让我们先来看一看具体的效果图:

根据效果来分析我们的 Store 至少是一个数组,数组里面是一个对象,这个对象至少有两个属性分别是 name 和 icon,那么我们应该先来定义全局的 state 和 这个对象。

// 全局 stateclass AppState {List<AVList> data;AppState(this.data);
}
import 'package:flutter/material.dart';// 具体使用的对象
class AVList {final String name;final IconData icon;AVList(this.name, this.icon);AVList.fromJSON(Map<String, dynamic> json):name = json['name'],icon = json['icon'];
}

你能看见它们分别做了两件事情,往ListView中添加一个Item,将最后一个Item从ListView中删除,那么接下来我们要定义它们的Action和Reducer。

// Action
import 'package:my_flutter_app/flow/listModel.dart';List<AVList> addItem(List<AVList> avLists, action){avLists.add(action.avLists[0]);return avLists;
}List<AVList> removeItem(List<AVList> avLists, action){avLists.removeLast();return avLists;
}
import 'package:redux/redux.dart';
import 'package:my_flutter_app/flow/listModel.dart';
import 'package:my_flutter_app/flow/listActions.dart';final ListReducer = combineReducers<List<AVList>>([TypedReducer<List<AVList>, AddAVListAction>(addItem),TypedReducer<List<AVList>, RemoveAVListAction>(removeItem)
]);class AddAVListAction {final List<AVList> avLists;AddAVListAction(this.avLists);
}class RemoveAVListAction {}

我们可以使用 combineReducers 来注册你的 Action,并且使用 TypedReducer 来映射你的 Action。

现在,我们可以在 main.dart 中定义你全局的 Store 和 Reducer :

AppState appReducer(AppState state, action) {return new AppState(ListReducer(state.data, action));
}final store = new Store<AppState>(appReducer,initialState: new AppState([new AVList("android", Icons.android)])
);

之前我们定义的数据结构中是一个List,其中对象的类型是AVList,因为我们可以在初始化的时候给它一个默认值。

接下来我们可以来完善 Widget 这一层,在这一层中基本上我们需要做:

  • Widget 绑定 Store 中的 state
  • Widget 触发某个 Action
  • Reducer 根据某个 Action 触发更新 state
  • 更新 Store 中 state 绑定的 Widget

在这里我们会使用到几个 Widget 和一个 Dispatch 来完成上述的步骤,第一步我们要使用 StoreProvider 它会将绑定的 Store 传递给它的所有子 Widget ,其次我们需要使用 StoreConnector 它会将更新后的数据 callback 给你,最后我们会使用 dispatch 来执行某些 Action ,完成某些 state 的操作。

完整的例子:

import 'package:flutter/material.dart';
import 'package:redux/redux.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:my_flutter_app/flow/listModel.dart';
import 'package:my_flutter_app/flow/listReducer.dart';class AppState {List<AVList> data;AppState(this.data);
}AppState appReducer(AppState state, action) {return new AppState(ListReducer(state.data, action));
}class AVReduxList extends StatelessWidget {final Store<AppState> store;AVReduxList({Key key, this.store}): super(key:key);@overrideWidget build(BuildContext context) {return new StoreProvider<AppState>(store: store,child: new MaterialApp(home: new Scaffold(appBar: new AppBar(title: new Text('AVReduxList'),),body: new Column(children: <Widget>[new StoreConnector<AppState, List<AVList>>(converter: (store) => store.state.data,builder: (BuildContext context, data){return new Container(height: 500.0,child: ListView.builder(itemCount: data.length,itemBuilder: (BuildContext context, int position){return new Padding(padding: EdgeInsets.all(10.0),child: new Row(children: <Widget>[new Text(data[position].name),new Icon(data[position].icon, color: Colors.blue)],),);},),);},),new Row(crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[new RaisedButton(color: Colors.blue,child: new Text('更新',style: new TextStyle(color: Colors.white),),onPressed: (){store.dispatch(new AddAVListAction([new AVList("android", Icons.android)]));},),new RaisedButton(color: Colors.blue,child: new Text('删除最后一项',style: new TextStyle(color: Colors.white),),onPressed: (){store.dispatch(new RemoveAVListAction());},)],)],),),));}
}

Redux Dev Tools

这是一个类似 Redux Time Travel 的 UI 小工具,在开发阶段我们可以使用这个工具来追溯你的操作,因此我们需要重新定义一个入口文件 main_dev.dart:

import 'package:flutter/material.dart';
import 'package:flutter_redux_dev_tools/flutter_redux_dev_tools.dart';
import 'package:redux_dev_tools/redux_dev_tools.dart';
import 'package:my_flutter_app/AVReduxList.dart';
import 'package:my_flutter_app/flow/listModel.dart';void main(){final store = new DevToolsStore<AppState>(appReducer,initialState: new AppState([new AVList("android", Icons.android)]));runApp(new ReduxDevToolsContainer(store: store,child: new AVReduxList(store: store,devDrawerBuilder: (BuildContext context){return new Drawer(child: new Padding(padding: new EdgeInsets.only(top: 24.0),child: new ReduxDevTools(store),),);},),));
}

在这里我们需要使用 DevToolsStore 来定义你的全局 Store ,另外我们还需要对原来的 AVReduxList进行一些改造,增加一个 devDrawerBuilder 属性来控制 DevTools 的绘制。

// AVReduxList.dartclass AVReduxList extends StatelessWidget {final Store<AppState> store;final WidgetBuilder devDrawerBuilder;AVReduxList({Key key, this.store,this.devDrawerBuilder}): super(key:key);@overrideWidget build(BuildContext context) {return new StoreProvider<AppState>(store: store,child: new MaterialApp(home: new Scaffold(endDrawer: devDrawerBuilder != null ? devDrawerBuilder(context) : null,...)))}
}

最后,我们在 VSCode 中重新添加一个新的启动项:

{"name": "Flutter_Redux_DevTools","type": "dart","request": "launch","program": "lib/main_dev.dart"
},

效果图:

flutter json转对象_在 Flutter 使用 Redux 来共享状态和管理单一数据相关推荐

  1. c#谷歌 json转对象_利用Google Gson实现JSON字符串和对象之间相互转换

    最近一个项目需要用到JSON,需要在JSON字符串和对象之间相互转换,在网上找了些资料,发现google的Gson还是比较不错的. 废话不说,下面是简单的例子: 先上源码:下载(包含jar包) Per ...

  2. flutter图片聊天泡泡_基于 Flutter+Dart 聊天实例 | Flutter 仿微信界面聊天室

    1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. flutter_chatroom项 ...

  3. Flutter json 和 对象之间的转换

    这里写的是 Flutter 自带的 convert 的 json 转换.下面以 3 个实例来说明. 一.自定义对象中不再嵌套其他对象: class Student {String name;int a ...

  4. flutter引入高德地图_玩玩Flutter Web —— 实现高德地图插件

    Red Deer 1.啰嗦几句 去年写了一个功能简单的高德地图插件给flutter_deer使用,当时支持了Android与iOS两端.前一阵子有一个issue问是否会支持Flutter Web,当时 ...

  5. flutter 人脸识别_使用flutter和tensorflow lite进行人脸识别认证

    flutter 人脸识别 The growth of processing power in devices and Machine learning allows us to create new ...

  6. flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮

    在Flutter中,我们可以两种方式实现小部件对拖动效果 GestureDetector() Draggable() GestureDetector 在开发过程中经常使用到GestureDetecto ...

  7. idea json转为对象_数据存储—JSON

    JSON文件存储 JSON全称JavaScript Object Notation,也就是JavaScript对象标记,它通过对象和数组的组合来表示数据. 1.对象和数组 对象:在JavaScript ...

  8. java 解析 json 索引对象_怎么获取json对象的属性和值

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript(Standard ECMA-262 ...

  9. json数据解析_「Flutter实战」22.JSON解析和复杂数据模型转换

    22.JSON解析和复杂数据模型转换技巧 json转Model类 创建model文件夹,在里面新建category.dart类 主要根据这个json来分析我们要做成类的样子 json数据 class ...

最新文章

  1. Linux下遍历文件夹的实现
  2. 如何降低数据中心宕机事件的影响
  3. 历届奥运会中国金牌数
  4. linux获取tomcat进程,Shell 获取Tomcat进程号
  5. JMETER目录结构详解
  6. 34000+技术博主齐聚,一周发文近 20,000 篇,网友:啥活动?
  7. 谷粒商城:12.仓储服务 — 仓库管理
  8. Java图书管理系统(控制台程序)
  9. C++ primer(第5版)第三章 字符串、向量和数组 学习笔记
  10. 前端工程化--yeoman使用
  11. 有关SPSS中Fisher精确检验无法进行的解决方法(由于无法打开临时文件,因此无法进行计算)
  12. Excel 填充间格空白单元格与最上临近非空单元格值相同
  13. 神经元的细胞体内有什么,神经元的细胞体在哪里
  14. optimizer.zero_grad()
  15. Android应用自启动保活手段与安全现状分析
  16. 【31】poisoned TLP导致的MCE问题
  17. PHP随堂笔记时区的设置
  18. 无线路由器当作无线交换机使用
  19. 李森 计算机学院,成都东软学院
  20. 关于微软应用商店无法联网 错误代码:0x80072EFD的问题终于解决了

热门文章

  1. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
  2. 计算机成原理第2版,清华大学出版社-图书详情-《计算机组成原理(第2版)》...
  3. 分步傅里叶算法_分布傅里叶算法求解非线性薛定谔的matlab程序问题
  4. HALCON 20.11:深度学习笔记(2)
  5. HALCON不同图像格式保存时间对比表
  6. VC InitInstance函数
  7. java js base64_java与js转base64编码格式
  8. Chrome的插件扩展程序安装目录是什么?在哪个文件夹?
  9. 关于Chrome Devtools你可能有所不知的几个技巧
  10. C#2.0 Socket套接字编程之实例初探 200