Flutter知识整理
Dart
结合了静态语言和动态语言的特性
强类型语言
- var声明变量
- 自动推导数据类型
- if语句只支持bool类型,switch支持string类型
- 数组=list
- Runes表示符号数字
- 支持闭包
- int double 没有float
- ?? ??= ~/整除
- 方法可以设置默认值和指定名称
- 自带getter、setter,final const修饰则只有getter,都支持getter、setter重写
- Zone:指定代码执行环境,隔离的一个环境,允许你在里面执行代码、捕获处理异常
- 为什么要使用Zone:Dart是单线程,但需要异步处理代码,捕捉异步操作错误,而不是每次Future都try-catch,
- Zone和Future的关系:互联、Future使用Zone上下文、通过Zone捕获Future异常
- Future、Stream都是对Zone的封装
..表示什么意思
- 级联操作符
- ..返回的是this,而.返回的是该方法返回的值
作用域
- 没有public privite 默认就是公开的,私有变量以下划线_开头
- 有@protect注解:只能被同一类及其子类访问
是不是单线程模型
- 在单线程中是以消息循环机制来运行的
- 一个微任务队列:microtask queue,microtask优先级高于event queue,所以m太多,就可能会对触摸、绘制等外部事件造成阻塞卡顿
- 一个事件队列:event queue
- main()函数执行完毕,消息循环机制启动,先按照先进先出执行微任务队列,然后执行事件队列,循环往复
多任务如何并行
- worker-isolate
- 一个isolate就是一个isolate执行环境的引用,一般来说就是通过俩俩控制完成交互
四大线程
- UI Runner(处理应用程序的UI逻辑,用户点击响应、界面更新、状态管理)
- GPU Runner(显卡绘制:将UI Runner发出的绘制命令发送到GPU,以便执行高效的图形渲染)
- IO Runner(事物)
- Platform Runner(原生主线程)
Future
- 异步处理的工具
- 默认往事件队列插入事件,有空余时间就去执行,执行完毕调用Future.then(v)
- Future.microtask往微任务队列插入任务,提高他的执行效率
- 在Dart的每一个isolate中,执行的优先级为:Main>MicroTask>EventQueue
Stream
- 异步处理工具
- 可以接收多个异步结果,而Future只能接收一个
- Stream.fromFuture创建,也可以是StreamController创建控制
- 普通的Stream只能有一个订阅者,要想多个订阅,就要使用asBoardcastStream()
mixin
- 定义的类不能有构造方法:避免继承多个类而造成父类构造方法冲突
- 不能直接实例化
- 不能继承其他类
- 只能使用with关键字
- 为了实现代码复用,比如多个类都需要使用日志记录功能
- 可以为一个类实现多种特性的组合
Flutter
DEBUG模式JIT(运行时编译),Release模式AOT(预编译)
和React Native的区别
- Flutter是通过skia(图形渲染引擎)渲染文本、图形。
PlatformView
- 嵌套原生View到FlutterUI
- VirtualDisplay虚拟显示器,调用DisplayManager的createVirtualDisplay()将虚拟显示器的内容显示在surface控件上,然后将surface的id通知给Dart,让engine绘制的时候,在内存中找到对应的surface画面内存数据,然后绘制出来,实时控件截图渲染技术
- 原生创建容器,控制权交给Flutter
- 原生视图被渲染到Flutter的Widget树、
StatefulWidget
- initState(): 初始化,无法获取到context,需要通过Future.delayed获取
- didChangeDependencies():在initState之后调用
- deactivate():当state暂时被移出视图被调用,页面切换也会被调用,和安卓的onPause差不多
- dispose(): 被销毁的时候调用
- didUpdateWidget(): 状态发生变化的时候调用
如何与Android、iOS通信
- PlatformChannel
- BasicMessageChannel: 传递字符串、半结构化信息
- MethedChannel: 传递方法调用,Flutter主动调用Native方法,获取方法的返回值
- EventChannel:数据流通信
Widgets、RenderObjects、Elements
- Widget: 仅仅用于存储渲染所需要的信息
- RenderObject:管理布局、绘制
- Elements: 控件树实体
状态管理
- 全局状态、局部状态
- 局部状态:比如一个控件输入信息
- 全局状态:登录后从后台传入的userId
- 当全局状态越来越多的时候,需要我们管理的时候,我们就需要状态管理
- setState:小型应用,单个Widget状态管理,不是立即生效,下一帧才会生效
- InheritedWidget是Flutter中的基础状态管理方案:希望在Widget树种共享状态的场景
- InheritedModel则是增强版
- Provider:
- Riverpod:
- Bloc:基于Stream的状态管理库,适合大型项目
- GetX:状态管理、路由管理、依赖注入
如何统一管理错误页?