angularjs中state的参数4_三种架构在Flutter中的尝试

场景说明

动图展示

功能简介

       一个常见的"评价列表页",点击"评价列表页"中的任意一项跳转进入"评价详情页"。在"评价详情页"我们可以看到该评论完整的评价内容和评价大图,同时"评价列表页"和"评价详情页"都带有分享和点赞的功能。

MVC架构

架构视图

7b925c12733707731caba59c4a056ff9.png

工程结构

b1c02a542a06feb6f0bdfd326624cbe1.png

  • 外层

    main入口函数run起CommentApp这个App的工程入口

  • widgets

    comment_list_item.dart以及在它下面的comment_widget_pub是封装的两个视图组件,一个是列表的每一个item的样式,另一个是"评价详情页"和"评价列表页"的底部操作栏(点赞,分享)样式封装

  • screens

    comment_detail和comment_list对应我们的两个页面"评价详情页"和"评价列表页"

  • mvc

    MVC模式中的Control类和Model类

  • model

    comment_item_model对应的是评价列表页每一个item背后的数据封装

搭建步骤

以评论中的点赞操作为例

1.

03ae39681b181254293e31c9463147ef.png

  • columnControl是comment_widget_pub里面的一个方法,封装了一个底部操作栏的视图,包含了"点赞"和"分享"的功能。

  • 箭头处的Con().praise1方法被View的onTap事件触发,是非常常见的一种从View到Control建立连接的调用方式

0fbf233ba6b589dfebdd82acc7c198be.png


2.

438a0b53606fb7ec481cd22fe6f12f7e.png

  • Control与View建立连接的方式一般是将Control与State进行绑定,比如在Control进行初始化的时候传入,使得Control与每个页面的View变得一一对应。这里只是简单的把当前的state通过方法参数传入Control,接下去看Control类中praise2方法的实现.

16d3996ec7d8fe82c7e4b1a07398227e.png

  • 在Control中调用State的setState方法起到一个当Model参数改变,View界面能够主动refresh的效果。

f09af44ee51f199a8c473931ad671f92.png


3.

130d204962be991f5085d9f979eda974.png

  • 可以直接通过Control类访问对应的Model,然后在Model 中做相应的数据上的处理,这样View与Model就建立了连接

a9ca72be16405107ab4211786611f015.png


4.

feaeac0cae017ddd3c10565da6ab4758.png

  • 红色箭头处是一种非常普通的Control访问Model数据的方式,使得Control与Model建立连接

67797ee93d4149a6f340618d50eb85ef.png

MVP架构

架构视图

51a92e2a1b662d126cf48afc4462e7c5.png

工程结构

c94cebe0bec7e4d7a61e3b5b3d7d8473.png

  • 外层

    同上

  • widgets

    同上

  • screens

    同上

  • mvp

      以"评价列表页”为例,comment_list.dart实现了comment_list_iview.dart中的接口(如 onZanValueUpdate方法)而comment_list_presenter.dart实现了requestZan等异步方法。

  • model

    同上

搭建步骤

以评论中的点赞操作为例

1.

32a91e18d09d40745ba81e414da8efc3.png

  • 在ListScreen中创建对应的Presenter对象同时发起请求列表数据的网络请求,这样View和Presenter就建立了连接。

5395ed65b81efba85ded4fab505a0eac.png


2.

fb1cd3c05c30b3b4233e6f49b307f17c.png

  • 在CommentListPresenter中发起异步请求,这里用了assets下的资源文件读取做了应答数据的模拟,在请求成功后通过View之前实现的接口中的onListViewUpdate方法将结果返回给View进行渲染。

e388718dc1346ca62371463fd1d754f5.png


3.

d501d680673c358aaa0902796fa76162.png

  • 在CommentListPresenter中还有一个成员变量是Model,在这里Presenter通过它对Model数据进行填充和更新的操作。

b8f434d0a01b31381d2ead23569afda5.png

Redux架构

架构视图

5a70ca61f757b87b4c206f8962372333.png

工程结构

625c33eb51dbaefdf7062ff2a07a8379.png

  • 外层

    同上

  • actions

    定义了各种操作类型,可以认为是一个状态变更的代号:PraiseAction(点赞操作),ShareAction(分享操作),FetchListAction(取列表数据)等

  • screens

    同上

  • reducer

    actions包下定义了状态变更的代号,而reducer里面就是描述了具体的状态是如何进行变更的,一个reducer通常对应一个或多个action。

  • middleware

    middleware是在action触发后且reducer到达前被执行,这里主要是为了插入一个请求评价列表数据的异步方法。

  • model

    比之前多了一个app_state.dart,它是Store所存储的状态描述。

搭建步骤

以评论中的点赞操作为例

1.

37e118151be2c8aa1874a36b36891585.png

  • listReducer内包含了三个action,分别是点赞、分享、数据填充,来操作app_state中的那份列表数据

e4f7e825afc6cb73979a993e555a32d7.png


2.

f752f15068f20a41f2c3867c51f1bc9f.png

  • 在App的入口的地方,也就是最顶层的地方,创建了一个Store对象。这里的Store构造函数包含了3个参数,reducer,state状态初始化和用来处理异步请求的thunkMiddleWare。

daafedb8f48c95cb7530938573dda667.png


3.

c183a16de0aef990f79937737493f874.png

  • 通过StoreConnector可以去Store中取得相应的数据,做类型转换,最后bulider出一个View。

6037e7e15e63961fef1c6dc7bcf9d1bd.png


4.

9ef435a5656a47359d1d24018f7e23f2.png

  • 通过StoreProvider的dispatch操作,途经Reducer,Store,最后反应在View上(点赞数+1)

7c628a9482acb808645af08b8273d091.png

总结

  1. 在多界面互动的场景下(比如"评价详情页"通过手动点赞,使得该评论的点赞数增加1,那么"评价列表页"相应的这条数据的点赞数也要增加1),Reudx的状态管理有天然的优势,而且Redux中的distinct属性也支持按条件的局部数据刷新。

  2. 在单独界面的场景下,推荐MVP,它的上手速度会比Redux快的多。

  3. Talk is cheap, Show me the code (如需源码请留邮箱或者进我们的flutter开发群)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值