Flutter知识整理

65 阅读4分钟

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:状态管理、路由管理、依赖注入

如何统一管理错误页?

  • ErrorWidget.builder