1、flutter与原生通信,platform channel原理?
(1)BasicMessageChannel:用于传递字符串和半结构化的信息
(2)MethodChannel:用于传递方法调用,通常用于调用native中某个方法。
(3)EeventChannel:用于数据流的通信。有监听功能,比如电量发生变化之后直接推送给flutter端。
每个channel都有三个重要变量:
name:stirng类型,代表channel名字,也是唯一标志符
messager:BinaryMessager类型,代表消息信使,是消息发送与接收的工具。
codec:MessagerCodec类型或者MethodCodec类型,代表消息编解码器。
2、future 和 stream数据流
都是用来处理异步编程的工具,区别在于,stream可以接收多个异步结果,future只能接收一个异步结果,
Stream 的创建可以使用 Stream.fromFuture,也可以使用 StreamController 来创建和控制。还有一个注意点是:普通的 Stream 只可以有一个订阅者,如果想要多订阅的话,要使用 asBroadcastStream()。
3、flutter 中多个异步请求都完成后执行某个操作?
利用Future.wait:
demo1(){
return true;
}
demo2(){
return true;
}
demo3(){
return false;
}
//调用 //dynamic 类型自己定
change() async{
await Future.wait<dynamic>([demo1,demo2,demo3]).then((e){
print(e);//[true,true,false]
}).catchError((e){
});
}
类似,await for
Stream<String> stream = new Stream<String>.fromIterable(['不开心', '面试', '没', '过']);
main() async{
await for(String s in stream){
print(s);
}
}
4、flutter 理念架构:
flutter 自下而上框架分为:Embedder,Engine,Framework。
1.Embedder是操作系统适配层,实现了渲染 Surface设置,线程设置,以及平台插件等平台相关特性的适配
2.Engine层负责图形绘制、文字排版和提供Dart运行时,Engine层具有独立虚拟机,正是由于它的存在,Flutter程序才能运行在不同的平台上,实现跨平台运行;是Skia 2D的绘图引擎库,提供了非常友好的API,在图形转换、文字渲染、位图渲染提供友好高效的表现。SKia还是跨平台的。
3.Framework层则是使用Dart编写的一套基础视图库,包含了动画、图形绘制和手势识别等功能,是使用频率最高的一层。
它实现了一套基础库,包含安卓、ios风格的UI界面,下面是通用widget,之后是一些动画绘制,渲染,手势等。
5、StatefulWidget生命周期
initState()
didChangeDependencies():State对象依赖关系发生变化的时候也会调用
deactivate():当State在那时从视图树中移除回调用,页面切换也会调用该方法
dispose():widget销毁时调用
didUpdateWidget:Widget状态发生变化的时候会调用
6、简述Widgets、RenderObjects 和 Elements的关系
1.Widget:仅用于存储渲染所需要的信息
2.RenderObject:负责管理布局,绘制等
3.Elements:巨大控件树上的实体
例如:一个UI视图树中,可能包含多个TextWidget,放在内部视图树的视觉,这些TextWidget都被填充到独立的Element中,Element会持有renderObject和widget的实例。。widget只是一个配置,RenderObject负责管理布局、绘制等操作。
第一次创建widget的时候,会相应创建一个element,然后将该元素插入树中。如果之后widget发生变化,则将旧的widget进行比较,并且相应的更新element,重要的是element不会被重建,只是更新而已。
7、什么是状态管理?状态管理框架?
应用由组件搭建而成,组件最重要的就是状态,状态是一个组件的UI数据模型,是组件渲染时的数据依据。
flutter状态分为全局状态,局部状态。
常用状态管理有ScopedModel,Bloc,Redux,Provider
8、flutter热重载
flutter的热重载是基于JIT编译模式的代码增量同步。由于JIT属于动态编译,能够将dart代码编译成生成中间代码,让Dart VM在运行时解释执行,因此可以通过动态更新中间代码实现增量同步。