返回顶部
首页 > 资讯 > 精选 >Flutter React编程的方法是什么
  • 853
分享到

Flutter React编程的方法是什么

2023-06-04 10:06:46 853人浏览 薄情痞子
摘要

这篇文章主要介绍“Flutter React编程的方法是什么”,在日常操作中,相信很多人在Flutter React编程的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter React编程

这篇文章主要介绍“Flutter React编程的方法是什么”,在日常操作中,相信很多人在Flutter React编程的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter React编程的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Reactive的诞生

谈起UI总会讲到mvc,它出现的时间很早,那时候还没有普及现代GUI广泛使用的事件驱动(消息循环)模型,所以很长的时间内,MVC都在进化,不断的被重新定义。到现在MVC已经是一个很宽泛的概念了。使用基础的MVC作为框架开发容易出现模块职责边界模糊,逻辑调用方向混乱。GUI框架进化后,将用户事件的分发处理集成到了View模块中,由此出现了MVP,MVP职责划分较清晰,逻辑调用方向也比较好把握,但是很繁琐,开发效率不高。再随着WEB的发展,标记语言被应用于界面描述,开始出现逻辑界面分离和无状态化界面,MVVM应运而生。MVVM让架构层面来提供数据和View的双向绑定,减轻了开发工作,但有时候也带来了一定程度的状态混乱。函数式编程在近年被重新提起,并引发潮流,催生了响应式界面开发,响应式是对GUI事件驱动模型的一种返璞归真。

个人对前端架构迭代的理解:

Flutter React编程的方法是什么

从迭代历程上看,Model和View是两个相对固定的角色,它们容易理解,也能很好的确定职责边界。如何去沟通Model和View是架构设计的关键,响应式的一般做法是让Model回到最初的事件驱动,结合函数式的数据流来驱动View刷新。这样有比较清晰的角色划分和简单易于理解的逻辑链接,能较好的统一编程模式。

Flutter React编程的方法是什么

Flutter的Reactive特性

通常GUI框架都有一些共同点,比如View的树形层级,消息循环,Vsync信号刷新等,Flutter也继承这些经典的设计,但是Flutter并没有使用标记语言来描述界面(例如Web中的htmlAndroid中的XML),这其中有Flutter立足于响应式的初衷。Reactive是一款将事件数据流作为核心的开发模型,UI框架会提供相应的特性来提供更好的支持。

描述界面而不要操作界面

有一种说法认为函数式语言和命令式语言的不同在于命令式语言是给计算机下达指令而函数式语言是向计算机描述逻辑。这种思路在Flutter UI中得到了体现。Flutter不提倡去操作UI,它当然也基本不会提供操作View的api,比如我们常见的类似TextView.setText(),Button.setOnClick()这种是不会有的。对界面的描述是可以数据化的(类似XML,JSON等),而对界面的操作是很难数据化的,这很重要,响应式需要方便可持续的将数据映射成界面。

Flutter React编程的方法是什么

在Flutter中用Widget来描述界面,Widget只是View的“配置信息”,编写的时候利用dart语言一些声明式特性来得到类似结构化标记语言的可读性。不论Stateless Widget 还是 Stateful Widget都是不可变的(immutable),其中的成员变量也应该都是final的,也就是说,Widget是“只读”的。Widget是数据的映射,当数据改变的时候,我们需要重新创建Widget去更新界面,这意味着Widget会创建销毁的非常频繁,不过Flutter使用的Dart虚拟机能高效的处理这种短周期的轻量对象。

这种设计思路对刚接触的开发者可能有些不习惯,我们可以借助开发Android中的ListView(iOS中的TableView)来理解:我们通常先准备好一个数据List,然后实现一个Adapter来将List中的items映射成一个个itemView,最后将List和Adapter设置给ListView。这样当我们改变List中的数据,ListView就会相应的刷新View。Flutter类似,我们准备好Widgets(只不过Widget的“容器”是Tree而不是List),Flutter会提供Adapter(RenderObjectToWidgetAdapter)将其映射成渲染用的RenderObject,当Widget更新时就会刷新界面。

Flutter React编程的方法是什么

另外,Widget也能通过设置Key来缓存复用,在类似ListView的场景中,Item Widget的复用是很有收益的。

基于共同祖先通信

在我们国家,如果你想和别人沟通上拉近距离,有时候会进入到类似“我们500年前是一家”的这种语境中。在Flutter中,如果两个组件要通信,也是去找祖先(当然,也有可能两个组件本身就有遗传关系),Flutter把它描述成“数据上行,通知下行”。

Flutter React编程的方法是什么

但是,在一个非常复杂的树形层级中,要找到某位“祖先”并不是很容易的事情,而且性能也不好。Flutter为此做了优化,提供了InheritedWidget,“祖先”Widget继承该类型后,child可以通过BuildContext中提供的inheritFromWidgetOfExactType方法方便的找到在层级中离的最近的那位“祖先”。该方法做了优化,效率很高,并且可以让child和“祖先”建立依赖关系,方便做刷新。

Flutter中并没有提倡类似controller的概念(像Android中的Activity,ioS中的ViewController),本身View是不可操作的,controller也就失去了意义。那么,组件之间的通信就必须在View层“自力更生”了。

函数式数据流

这肯定不是Flutter才有的,要想把响应式实现的简洁优雅,就要利用好语言的函数式特性。Flutter的亮点是它使用的Dart语言能把这件事情变的很轻量,你基本不需要引入什么第三方库就能做到(不过确实有RxDart库,但感觉只是做了额外的增强),而且明显语言Api的设计也往这个方向上做了优化,非常方便。具体可以看看Stream和RxDart。

基于React的框架实践

统一状态管理和单向数据流

通过React的实践,响应式可以很好的解决数据到界面的更新,而且效率也不错。但是自身对数据状态的管理不足,React官方提出了Flux,而在面对复杂业务场景时,Flutter官方也是推荐Redux架构,我们也是根据这一思路搭建的框架。

Flutter React编程的方法是什么

首先是业务逻辑和界面分离,界面是无状态(Stateless)的,我们也正在尝试自动化的方法直接生成界面代码,所以Widget中是不会有业务逻辑代码的。当我们把一个能描述当前界面的数据(State)交给View层时,界面就应该能正常展示。用户和界面交互会产生Action,Action代表了用户交互的意图,Action可以携带信息(比如用户使用输入留言,Action中就应该携带用户留言的内容信息)。Action会输入给Store,Store会通过注册的Interrupters对Action做前期拦截处理,可以通过Interrupter截拦Action,也可以把一个Action重新改写成另外的Action。Store然后收集相应绑定的Reducers对Action做一次reduce操作,产生新的State,并通知界面刷新。

通常我们在创建Store的时候就组册好Reducer和Interrupter:

  Store<PublishState> buildPublishStore(String itemId) {//设置状态初始值

  PublishState initState = new PublishState();

  initState.itemId = itemId;

  initState.isLoading = true;//创建Reducer和对应Action的绑定

  var reducerBinder = ActionBinder.reducerBinder<PublishState>()

  ..bind(PublishAction.DETaiL_LOAD_COMPLETED, _loadCompletedReducer)

  ..bind(PublishAction.DELETE_IMAGE, _delImageReducer)

  ..bind(PublishAction.ADD_IMAGE, _addImageReducer);//创建Interrupter和对应Action的绑定

  var interrupterBinder = ActionBinder.interrupterBinder<PublishState>()

  ..bind(PublishAction.LOAD_DETAIL, _loadDataInterrupter)

  ..bind(PublishAction.ADD_IMAGE, UploadInterruper.imageUploadInterrupter); //创建Store

  return new CommonStore<PublishState>(

  name: 'Publish',

  initValue: initState,

  reducer: reducerBinder,

  interrupter: interrupterBinder);

  }

Reducer中就是处理用户交互时产生的Action的逻辑代码,接收3个参数,一个是执行上下文,一个要处理的Action,一个是当前的State,处理结束后必须返回新的State。函数式理想的Reducer应该是一个无副作用的纯函数,显然我们不应该在Reducer中去访问或者改变全局域的变量,但有时候我们会对前面的计算结果有依赖,这时可以将一些运行时数据寄存在ReduceContext中。Reducer中不应该有异步逻辑,因为Store做Reduce操作是同步的,产生新State后会立即通知界面刷新,而异步产生对State的更新并不会触发刷新。

  PublishState _delImageReducer(ReduceContext<PublishState> ctx, Action action, PublishState state) {int index = action.args.deleteId;

  state.imageUplads.removeAt(index);return state;

  }

  Interrupter形式上和Reducer类似,不同的是里面可以做异步的逻辑处理,比如网络请求就应该放在Interrupter中实现。

*为什么会有Interrupter呢?换一个角度,我们可以把整个Store看成一个函数,输入是Action,输出的是State。函数会有副作用,有时我们输入参数并不一定得会相应有输出,比如日志函数( void log(String) ),我们输入String只会在标准输出上打印一个字符串,log函数不会有返回值。同样,对Store来说,也不是所有的Action都要去改变State,用户有时候触发Action只要想让手机震动下而已,并不会触发界面更新。所以,Interrupter就是Store用来处理副作用的。

  ///截拦一个网络请求的Action,并在执行请求网络后发出新Action

  bool _onMtopReq(InterrupterContext<S> ctx, Action action) {

  NetService.requestLight(

  api: action.args.api,

  version: action.args.ver,params: action.args.params,

  success: (data) {

  ctx.store.dispatch(Action.obtain(Common.MTOP_RESPONSE)

  ..args.mtopResult = 'success'

  ..args.data = data);

  },

  failed: (code, msg) {

  ctx.store.dispatch(Action.obtain(Common.MTOP_RESPONSE)

  ..args.mtopResult = 'failed'

  ..args.code = code

  ..args.msg = msg);

  });return true;

  }

通常我们会让一个界面根部的InheritedWidget来持有Store,这样界面上的任何Widget都能方便的访问到Store,并和Store建立联系。这种做法可以参考redux_demo,再此不详细展开。

最后简单的说说Store的实现,Store能够接收Action,然后执行reduce,最后向widget提供数据源。Widget可以基于提供的数据源建立数据流,响应数据变更来刷新界面。这其中最核心的就是Dart的Stream。

  ......

  //创建分发数据的Stream

  _changeController = new StreamController.broadcast(sync: false);//创建接收Action的Stream

  _dispatchController = new StreamController.broadcast(sync: false);//设置响应Action的函数

  _dispatchController.stream.listen((action) {

  _handleAction(action);

  });

  ......

  //向Store中分发Action

  void dispatch(Action action) {

  _dispatchController.add(action);

  }

  //Store向外提供的数据源

  Stream<State> get onChange => _changeController.stream;

  Store中最核心的对Action进行reduce操作:

  //收集该Action绑定的Reducer

  final List<ReduceContext<State>> reducers = _reducers.values

  .where((ctx) => ctx._handleWhats.any((what) => what == action.what))

  .toList();

  //执行reduce

  Box<Action, State> box = new Box<Action, State>(action, _state);

  box = reducers.fold(box, (box, reducer) {

  box.state = reducer._onReduce(box.action, box.state);return box;

  });

  //触发更新

  _state = box.state;

  _changeController.add(_state);

  Widget基于Store暴露的数据源建立数据流:

  store.onChange//将Store中的数据转换成Widget需要的数据

  .map((state) => widget.converter(state))

  //比较前一次数据,如果想等则不用更新界面

  .where((value) => (value != latestValue))

  //更新界面

  .listen((value){

  ...

  setState()

  ...

  })

组件化的扩展

我们在业务开发中发现,有时候一个页面一个Store会带来组件复用上的不方便,比如视频播放组件是一个逻辑比较内聚的组件,如果把它的reducer都集中放在页面的Store中那么别的页面想要复用这个开发好的视频组件就不方便了,这时候视频组件可能需要一个独立的Store来存放视频播放相关的逻辑。我们遵循Flutter组件通信方法,将框架扩展为允许存在多个Store,并且做到对Widget开发无感知。

Flutter React编程的方法是什么

Widget只能感知离它最近的Store持有者,该Store会向更高层级Store转发Action,同时接收来自更高层级Store的数据变更并通知Widget。

到此,关于“Flutter React编程的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Flutter React编程的方法是什么

本文链接: https://lsjlt.com/news/237279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flutter React编程的方法是什么
    这篇文章主要介绍“Flutter React编程的方法是什么”,在日常操作中,相信很多人在Flutter React编程的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter React编程...
    99+
    2023-06-04
  • react的diff方法是什么
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react的diff方法是什么?一、Diff算法的作用 渲染真实DOM的开销很大,有时候我们修改了某个数据,直接渲染到真实dom上会引起整个...
    99+
    2023-05-14
    React
  • Flutter混合开发的方法是什么
    今天小编给大家分享一下Flutter混合开发的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为什么要混合方案具有一...
    99+
    2023-06-04
  • 提升Flutter体验的方法是什么
    本篇内容主要讲解“提升Flutter体验的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“提升Flutter体验的方法是什么”吧!目标过度的丢帧从视觉上会出现卡顿现象,体现在用户滑动操作...
    99+
    2023-06-04
  • Java MapReduce编程方法是什么
    这篇文章主要讲解了“Java MapReduce编程方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java MapReduce编程方法是什么”吧!实验题目:Ma...
    99+
    2023-06-22
  • Linux DMA编程方法是什么
    本篇内容介绍了“Linux DMA编程方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!DMA即Direct Memory Acces...
    99+
    2023-06-16
  • Scala编程的思考方法是什么
    这篇文章主要讲解了“Scala编程的思考方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala编程的思考方法是什么”吧!在进行什么编程的时候,你用什么方法来思考呢?用命令是方法来...
    99+
    2023-06-17
  • Windows下多线程编程的方法是什么
    在Windows下,多线程编程的方法主要有以下几种: 使用WinAPI函数:使用Windows API函数创建和管理线程。可以使...
    99+
    2023-10-23
    Windows
  • 汇编基础程序编写的方法是什么
    这篇文章主要介绍“汇编基础程序编写的方法是什么”,在日常操作中,相信很多人在汇编基础程序编写的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”汇编基础程序编写的方法是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-25
  • react创建元素的方法是什么
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react创建元素的方法是什么?创建 react 元素React 元素React 元素(React element),它是 React 中最小的基本单位。...
    99+
    2023-05-14
    元素 React
  • React状态提升的方法是什么
    今天小编给大家分享一下React状态提升的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.介绍所谓 状态提升 就...
    99+
    2023-07-06
  • Java界面编程方法是什么
    这篇文章主要介绍“Java界面编程方法是什么”,在日常操作中,相信很多人在Java界面编程方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java界面编程方法是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-03
  • Flutter构建自定义Widgets的方法是什么
    这篇文章主要讲解了“Flutter构建自定义Widgets的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter构建自定义Widgets的方法是什么”吧!一.组合widge...
    99+
    2023-06-26
  • vc多线程编译的方法是什么
    VC++多线程编译的方法包括以下几种:1. 使用OpenMP:OpenMP是一种用于多线程编程的开放式并行性API,可以通过在代码中...
    99+
    2023-08-09
    vc
  • idea编写java程序的方法是什么
    编写Java程序的方法是以下几个步骤:1. 确定程序需求和目标:确定程序要实现的功能和目标。2. 设计程序结构:根据需求和目标,设计...
    99+
    2023-08-11
    idea java
  • Vue组件化编程的方法是什么
    本篇内容主要讲解“Vue组件化编程的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue组件化编程的方法是什么”吧!2.1 模块与组件、模块化与组件化2.1.1.模块理解:向外提供特定...
    99+
    2023-07-05
  • react跨域解决方法是什么
    React本身并不提供跨域解决方案,因为跨域是一个与浏览器相关的安全机制。解决跨域问题的方法在于服务器端和浏览器端的配合。服务器端可...
    99+
    2023-09-06
    react
  • React中代码分割的方法是什么
    这篇“React中代码分割的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React中代码分割的方法是什么”文章吧...
    99+
    2023-06-29
  • C++ socket网络编程方法是什么
    本篇内容主要讲解“C++ socket网络编程方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ socket网络编程方法是什么”吧!功能完成Cpp客户端简单功能,可收发数据。源码#...
    99+
    2023-06-25
  • Java8函数式编程方法是什么
    这篇“Java8函数式编程方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java8函数式编程方法是什么”文章吧。什...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作