重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、前言
创新互联建站长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为上城企业提供专业的网站设计制作、网站建设,上城网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
Flutter开发,就需要对各种状态的管理,就是在请求数据的时候需要实时变化,各种交互变化等,在没有使用GetX之前使用Provider,用Provider的时候觉得真香,挺方便的,需要刷新的时候直接 notifyListeners(); 用了GetX之后觉得Provider太繁琐了。这边介绍下GetX的使用以及常用的方法。
二、 GetX
GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。
1、相关优势:
三、使用
1、第一步 引入get
2、第二步
修改入口、配置路由
3、路由
Routes类
Pages类
4、状态管理
我一般一个page对应一个controller, controller来处理逻辑,控制page.
简单使用
5、依赖注入
依赖注入也是我喜欢的,可以减少很多工作。
第一步
第二步
6、跨页面交互
7、黑暗模式
可以参考前期写的博客。 黑暗模式的适配
Flutter跟安卓的Activity、iOS的ViewController一样拥有自己的生命周期, Flutter中一切都是Widget,渲染方式有点像H5的DOM树。
Flutter生命周期可以分为3个阶段:
1、实例化组件并添加到树, 即Navigator.push;
2、状态变化,即打开新的widget或者依赖的上级widget发生变化;
3、从树中移除, 即Navigator.pop。
在Flutter中Widget都是不可变的, 但实际上需要根据对应的状态刷新Widget。 从而产生了StatelessWidget和StatefulWdiget, StatefulWidget是由2个对象Widget和State组成的。
为什么将State和Widget分开呢?
答案是性能, State管理状态(可以理解为Controller),Widget是UI(即View)。 根据状态变化每次生成Widget(即View)可以节省内存,即不必每次创建状态对象State。
构造函数:
同其它高级语言, 只执行一次;
initState:
插入到渲染树时调用,只执行一次。(类似Android Fragment的onCreateView函数)
didChangeDependencies:
1、在初始化initState后执行; 2、显示/关闭其它widget。 3、可执行多次;
didUpdateWidget:
上级节点rebuild widget时, 即上级组件状态发生变化时会触发子widget执行didUpdateWidget;
deative:
有点像Android的onStop函数, 在打开新的Widget或回到这个widget时会执行; 可执行多次;
dispose:
类似于Android的onDestroy, 在执行Navigator.pop后会调用该办法, 表示组件已销毁;
reassemble:
点击闪电会执行,只用于调试时的hot reload。 release版本不会执行该函数。
常见业务场景:
Widget A打开Widget B: Navigator.push(B)
B构造函数---B initState---B didChangeDependencies---B build---A deactive---A didChangeDependencies.
Widget B退出: Navigator.pop
A deactive---A didChangeDependencies---A build---B deactive---B dispose
可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。
activity生命周期和Flutter对应关系:
Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:
1、 resumed 界面可见, 同安卓的onResume。
2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;
3、paused应用挂起,比如退到后台,失去了焦点且不会收到drawframe回调;同安卓的onStop;
4、suspending, iOS中没用,安卓里就是挂起,不会再执行drawframe回调;
下面是生命周期:
1、初次打开widget时,不执行AppLifecycleState的回调;
2、按home键或Power键, AppLifecycleState inactive----AppLifecycleState pause
3、从后台到前台:AppLifecycleState inactive---ApplifecycleState resumed
4、back键退出应用: AppLifecycleState inactive---AppLifecycleState paused
flutter也有自己的生命周期,不像Android中Application、Activity、Fragment生命周期分得这么明细,flutter中只在StatefulWidget维护的State中维护了5个生命周期函数(可用于App中的页面跳转,相当于Android中View的生命周期)。而Activity中的生命周期可以通过实现WidgetsBindingObserver 接口,在didChangeAppLifecycleState()中获取状态回调。
initState()--didChangeDependencies()--deactivate()--dispose() didUpdateWidge()
1.Widget A打开Widget B: 调用 Navigator.push(B)
2.Widget B从Widget A退出: 调用Navigator.pop()
可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。
Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:
1、 resumed 界面可见, 同安卓的onResume。
2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;
3、paused应用挂起,比如退到后台,失去了焦点且不会收到 drawframe 回调;同安卓的onStop;
4、suspending, iOS中没用,安卓里就是挂起,不会再执行 drawframe 回调;
5、关于drawframe回调:Vsync信号到来之后,Engin会按顺序回调 window 的两个回调函数: onBeginFrame() 和 onDrawFrame() 。这两个回调是 SchedulerBinding 初始化的时候设置给 window 的。对应的是 SchedulerBinding.handleBeginFrame() 和 SchedulerBinding.handleDrawFrame() 。
应用场景:
1、初次打开widget时,不执行AppLifecycleState的回调;
2、按home键或Power键, AppLifecycleState inactive----AppLifecycleState pause
3、从后台到前台:AppLifecycleState inactive---ApplifecycleState resumed
4、back键退出应用: AppLifecycleState inactive---AppLifecycleState paused
Flutter (二)布局
Flutter (三) 状态管理
Flutter (四) Map转模型
Flutter (五) 网络请求
Flutter (六) 保留界面状态
Flutter (七) 混合开发 [配置]
Flutter (八) 混合开发 [Flutter完整项目嵌入到原生]
Material组件库中提供了输入框组件TextField
TextField用于文本输入,它提供了很多属性,我们先简单介绍一下主要属性的作用,然后通过几个示例来演示一下关键属性的用法。
prefix和prefixText 以及suffix和suffixText 不能同时存在
获取输入内容
通过onChange回调
通过controller监听
_controller .addListener(() {
print(_controller .text);
});
两种方式相比,onChanged是专门用于监听文本变化,而controller的功能却多一些,除了能监听文本变化外,它还可以设置默认值、选择文本
这里我们就用到了focusNode
焦点可以通过FocusNode和FocusScopeNode来控制,默认情况下,焦点由FocusScope来管理,它代表焦点控制范围,可以在这个范围内可以通过FocusScopeNode在输入框之间移动焦点、设置默认焦点等。我们可以通过FocusScope.of(context) 来获取Widget树中默认的FocusScopeNode。
Flutter实战