Flutter状态管理(五):Redux

Flutter状态管理(五):Redux,第1张

Flutter状态管理系列:

Flutter状态管理(一):ScopedModel

Flutter状态管理(二):Provider

Flutter状态管理(三):BLoC(Business Logic Component)

Flutter状态管理(四):ReactiveX之RxDart

Flutter状态管理(五):Redux

有做过H5前端开发的朋友应该很早就接触过这个,Redux在React/VUE中,与在Flutter/Dart中概念一样,没有任何区别;唯一的区别只是使用上的不同。

它主要由三部分组成:

下图是一个完整的数据触发及更新流程:

我们看到上面整个数据流,都是单向的,由View发起,最后到View的更新;

为啥这样设计?

小节二介绍了Redux最基本的原理,但是,如何用Redux来做一些异步 *** 作,比如:加载数据、请求API等?这里就引出来了Redux的中间件(Middleware),中间件能够让我们使得action在到达reducer之前,做些其它“动作”!有了中间件,我们不但可以请求API,还可以改变action,使得分发到其它reducer中去;

上图是有Middleware的流程图。

Redux在Flutter中的使用与在JavaScript中的使用方式稍微有点不同,为啥?

因为JavaScript是弱类型语言,而Dart是强类型语言,这就使得在JS中每个reducer可以独立管理,而在Flutter中需要由一个大对象来管理!

无论在JS中还是在Flutter中,通常都将action、reducer、store各自建一目录,放在redux目录下,目录结构如下:

ReduxPage在build中,也可以直接用StoreBuilder(参考ReduxPage2中写法),因为StoreBuilder也是InheritedWidget。

正因为Redux在Flutter中与在JS中不同,因此,在Flutter中,建议:

在一些计算较为复杂、 *** 作较为耗时或者 *** 作为引起页面重绘的场景,如果事件触发的频率毫无限制,除了带来性能上的负担,还会导致糟糕的用户体验。如:根据输入框输入的内容向服务端查询相关文章,用户多次点击收藏按钮……

在触发事件时,不立即执行目标 *** 作,而是给出一个延迟的时间,在该时间范围内如果再次触发了事件,则重置延迟时间,直到延迟时间结束才会执行目标 *** 作。

如设定延迟时间为500ms,

连续点击 收藏 按钮,停止点击时才会执行”收藏/取消收藏“ *** 作,只会执行一次”收藏/取消收藏“ *** 作

在触发事件时,立即执行目标 *** 作,同时给出一个延迟的时间,在该时间范围内如果再次触发了事件,该次事件会被忽略,直到超过该时间范围后触发事件才会被处理。

如设定延迟时间为500ms,

连续点击 收藏 按钮,在第一次点击时会立即执行”收藏/取消收藏“ *** 作,在本次 *** 作执行完成前的多次点击会被忽略,只会执行一次”收藏/取消收藏“ *** 作。

部分场景,如收藏等一些按钮,在连续多次点击时,上述方案可以过滤逻辑上的重复问题,但在UI上并没有做任何处理,比如做禁用样式、动画样式等

flutter加载h5很卡的解决方法如下:

一种临时解决方案,在切换动画加载完毕后,再去构造 WebView,这样从用户角度上看,就不会有路由切换动画的卡顿了。class WebViewPage extends StatefulWidget {undefined

final String uri;

WebViewPage({undefined

@required thisuri,

}) : assert(uri != null);

@override

_WebViewPageState createState() => _WebViewPageState();

}

class _WebViewPageState extends State {undefined

WebViewController _controller;

bool _animationCompleted = false;

@override

Widget build(BuildContext context) {undefined

// 主要是下面的代码

var route = ModalRouteof(context);

if (route != null && !_animationCompleted) {undefined

void handler(status) {undefined

if (status == AnimationStatuscompleted) {undefined

routeanimationremoveStatusListener(handler);

setState(() {undefined

_animationCompleted = true;

});

}

}

routeanimationaddStatusListener(handler);

}

return Scaffold(

title: widgettitle,

backgroundColor: Colorswhite,

body: _animationCompleted

WebView(

initialUrl: 'about:blank',

onWebViewCreated: (WebViewController webViewController) {undefined

_controller = webViewController;

_loadHtmlFromAssets();

},

)

: Container(),

);

}

_loadHtmlFromAssets() async {undefined

var uri = UridataFromString(

await rootBundleloadString(widgeturi),

mimeType: 'text/html',

encoding: EncodinggetByName('utf-8'),

)toString();

_controllerloadUrl(uri);

}

}

Fluent是目前国际上比较流行的商用CFD软件包,在美国的市场占有率为60%,凡是和流体、热传递和化学反应等有关的工业均可使用。

它具有丰富的物理模型、先进的数值方法和强大的前后处理功能,在航空航天、汽车设计、石油天然气和涡轮机设计等方面都有着广泛的应用。

FLUENT软件包含基于压力的分离求解器、基于密度的隐式求解器、基于密度的显式求解器,多求解器技术使FLUENT软件可以用来模拟从不可压缩到高超音速范围内的各种复杂流场。

FLUENT软件包含非常丰富、经过工程确认的物理模型,由于采用了多种求解方法和多重网格加速收敛技术,因而FLUENT能达到最佳的收敛速度和求解精度。

灵活的非结构化网格和基于解的自适应网格技术及成熟的物理模型,可以模拟高超音速流场、传热与相变、化学反应与燃烧、多相流、旋转机械、动/变形网格、噪声、材料加工等复杂机理的流动问题。

本文将为大家讲解如何通过pub库插件快速实现Flutter应用在双屏Android设备上交互通信。

插件地址: flutter_subscreen_plugin

双屏插件实现原理: FlutterPlugin 实现双屏

主屏上的UI,我们添加一个按钮,点击生成一个随机数,发送给副屏显示,用于验证主屏与副屏的通信交互:

副屏ui上我们在initState中监听主屏给副屏的消息流,并将监听到的数据展示在文本上:

完成上述步骤,简单的demo就做好了,如下是demo在实体设备的运行效果图:

流式布局在移动端是非常常见的,比如商品列表,瀑布流、标签页等等

Flutter 中提供了两种流式布局Wrap和Flow

Wrap可以进行水平方向或者垂直方向上的布局,在一行或者一列现实不完所有的widgets的时候,能够根据当前宽度或者高度自动换行。

alignment 不管设置什么属性都不能调整第一行的位置

包裹一个Container来看,当前Wrap没有占满全屏

把Container占满全屏才表现下面效果

我们一般很少会使用Flow,因为其过于复杂,需要自己实现子组件的位置转换,所以在很多场景下首先要考虑的是Wrap是否满足需求。Flow主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景。

首先从三者不同的设计理念对比,主要有三部分UI显示流程、状态更新机制、编译流程

Java文件编译成Class,然后被dex工具编译成dex最终打包成APK文件,随后通过adb命令安装到手机中Java文件发生変化,上述流程需要重新来一遍,安装到手机中,才能看到最终效果

网易云信播放器 Flutter 封装

事情是这样的 我们公司的业务是有 视频播放这一块业务 而且 是基于网易云信的 视频服务的 做的开发 。公司的App开发框架是使用 Flutter , 那么问题来了 Flutter 怎么 实现视频播放嘞 , 官方给出的解决方案 是 ### video_player 这个库的 实现 是 原生端做视频解码 然后通过 Texture 的方式 映射到 Flutter 中 但是解码器 IOS 使用的是 官方的 AVPlayer (苹果官方提供的播放器 啥都好 就是不支持流媒体播放 ) Android 解码器则是 exoplayer 很好很nice

但是

网易云信的视频 是加密的 只有自己的 播放器sdk 在能解码播放 android 和 ios 都支持流媒体 so 只能自己封装

Android 使用 SurfaceTexture 衔接 视频流 正常 但是 ios emmm 网易云信 播放器 返回 的 编码格式 是 NELP_YUV420 就是 YUV420 直接映射到 Flutter 黑屏 但是有声音

因为Skia 引擎底层只支持了 BGRA 格式的视频数据 所以 和黑屏了

首先我们吧 YUV420 转换成 CVPixelBufferRef 方法如下

该方法依赖 libyuv 请自行导入

然后是 pixelBuffer To SampleBuffer

最后吧 SmapleBuffer 转换 BGRA

方法如何使用

1 (鸟)振翼,拍翅

2 (旗帜等)飘动,飘扬

The flag fluttered in the breeze

旗帜在微风中飘动。

3 (脉搏,心脏)不规则跳动

Her heart fluttered with fear

她因害怕心跳得厉害。

4 焦急地乱动

5 颤动;(激动得)发抖

His fingers fluttered

他的手指颤动。

vt

1 振(翼),拍(翅)

The young bird fluttered its wings

雏鸟拍打着它的翅膀。

2 使焦急,使不安

3 使飘动

n

1 振翼;飘动[S]

2 兴奋;激动;焦急[S]

That TV play caused a mild flutter among the viewers

那出电视剧在观众中稍稍引起轰动。

3 英口小赌;小投机[C][S1]

4 医(心脏等的)扑动,振颤[C]

5 (录音机)放音失真,音频颤动[U]

以上就是关于Flutter状态管理(五):Redux全部的内容,包括:Flutter状态管理(五):Redux、Flutter中的节流与防抖(过滤重复点击)、flutter加载h5很卡等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9509745.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存