0、Dart是值转达照旧引用转达?
Dart是值转达。每次调用函数,转达已往的都是对象的内存所在,不是对象的复制。
知识点扩展:Swift的struct是值范例,class是引用范例;意思是:声明一个新的变量指向这个布局体,改变某个属性,原本的布局体属性不会发生变革;而类会随着改变
1、Flutter的焦点树
Widget:
1、利用设置和状态,形貌view的样子
2、当一个Widget发生改变时,Widget会重新build它的形貌
Element:
1、Element是widget的实例,在树中具体的位置。
RenderObject:
1、渲染树上的一个对象。
2、RenderObject是渲染库的焦点。
2、flutter 中Widget的分类
1、组合类
statelesswidget、statefullwidget
2、署理类
inheritedwidget:用于状态共享,Theme 、Localizations 、 MediaQuery 等,都是通过它举行状态共享,通过context获取共享的状态,ThemeData theme = Theme.of(context);
ParentDataWidget
3、绘制类RenderObjectWidget
RenderObject 的布局相关方法调用次序是 : layout -> performResize -> performLayout -> markNeedsPaint
3、mixin extends implement 之间的关系?
继承extends 混入mixin 接口实现implement,三者可以同时存在,前后次序是extends,mixin,implement。
Flutter的继承是单继承,子类重写超类的方法用override,子类调用超类的方法用super。
mixin是为了办理继承方面的题目而引入的机制,Dart为了支持多重继承,引入了mixin关键字。mixins的对象是类,mixins绝不是继承,也不是接口,而是一种全新的特性,可以mixins多个类,mixins的利用必要满意肯定条件。
mixin的利用条件:
1、mixin类只能继承自object
2、mixin类不能有构造函数
3、一个类可以mixins多个mixins类,但是不粉碎flutter的单继承
mixin就是为了办理Dart的多继承题目,但是mixin不能有构造方法,克制继承多个类产生构造方法冲突
4、Dart的语言特性
1、Dart统统都是对象,全部的对象继承自Object。
2、Dart和Swift一样都是强范例语言,可以用var或 dynamic来声明一个变量,Dart会自动推断其数据范例。
3、没有赋值初始值的变量都会默认null
4、Dart支持顶层方法,如main方法,可以在方法内部创建方法
5、Dart支持顶层变量,也支持类变量或对象变量
6、Dart没有public protected private等关键字,假如变量以下划线开头(_button),体现这个变量在库中是私有的。
5、Dart 中的级联操作符 (未利用疑问)
Dart 当中的 「..」意思是 「级联操作符」,为了方便设置而利用。「..」和「.」差异的是 调用「..」后返回的相称于是 this,而「.」返回的则是该方法返回的值 。
6、Dart 的单线程模子是怎样运行的?
Dart在单线程中是以消息循环机制来运行的,包罗两个使命队列,微使命队列(microtask queue)、事故队列(event queue)。
flutter启动后,消息循环就启动了。按照先辈先出原则逐个实验微使命队列中的使命,实验完毕后实验事故队列中的使命,事故队列中的使命实验完毕之后,在实验微使命队列,云云循环往复。
7、await for 与 stream流 (待深入研究)
Stream<String> stream = new Stream<String>.fromIterable(['1', '2', '3', '4']);main() async{ print('start'); await for(String s in stream){ print(s); } print('end..');}效果start1234end..await for是不停获取stream流中的数据,然后实验循环体中的操作。await for一样平常用在知道Stream什么时间完成,而且必须期待转达完成后才气利用,否则就会不绝壅闭。
8、Stream 与 Future的关系?
1、Future体现稍后得到的一个数据,全部异步操作的返回值都用Future来体现。
2、Future只能体现一次异步获取的数据。
3、Stream体现多次异步获取的数据。例如按钮多次点击,这个点击事故就是Stream。
4、Future只返回一 次值,Stream返回多次值。
5、Dart中同一利用Stream流处理处罚数据。
9、Stream 有哪两种订阅模式?分别是怎么调用的?
Stream单订阅和多订阅两种。
Stream 默认处于单订阅模式,以是同一个 stream 上的 listen 和别的大多数方法只能调用一次,调用第二次就会报错。
Stream 可以通过 transform() 方法(返回另一个 Stream)举行一连调用。通过 Stream.asBroadcastStream() 可以将一个单订阅模式的 Stream 转换成一个多订阅模式的 Stream,isBroadcast 属性可以判断当前 Stream 所处的模式。
10、Flutter中的Widget、State、Context 的焦点概念?是为了办理什么题目?
主要是为了办理多个部件之间的交互和部件自身状态的维护。
1、Widget: 在Flutter中,险些全部东西都是Widget。将一个Widget想象为一个可视化的组件(或与应用可视化方面交互的组件),当你必要构建与布局直接或间接相关的任何内容时,你正在利用Widget。
2、Widget树: Widget以树布局举行组织。包罗其他Widget的widget被称为父Widget(或widget容器)。包罗在父widget中的widget被称为子Widget。
3、Context: 仅仅是已创建的全部Widget树布局中的某个Widget的位置引用。简而言之,将context作为widget树的一部门,此中context所对应的widget被添加到此树中。一个context只附属于一个widget,它和widget一样是链接在一起的,而且会形成一个context树。
4、State: 界说了StatefulWidget实例的举动,它包罗了用于”交互/干预“Widget信息的举动和布局。应用于State的任何更改都会欺压重修Widget。
11、Dart异步编程中的 Future关键字
Dart中,实验一个异步使命利用Future来处理处罚。
在 Dart 的每一个 Isolate 当中,实验的优先级为 :Main > MicroTask > EventQueue。
12、什么是Isolate?
Dart只有一个主线程,其着实Dart中并不是叫 Thread ,而是有个专门名词叫 「isolate(隔离)。
用官方文档中界说一句话来概括: An isolated Dart execution context .大概的意思就是「isolate现实就是一个隔离的Dart实验的上下文情况(大概容器)」。「isolate是有本身的内存和单线程控制的事故循环」
其着实Dart也会遇到一些耗时盘算的使命,不发起把使命放在主isolate中,否则容易造成UI卡顿,必要开发一个单独isolate来独立实验耗时使命,然后通过消息机制把终极盘算效果发送给主isolate实现UI的更新。」 在Dart中异步是并发方案的底子,Dart支持单个和多个isolate中的异步。。
「Dart没有共享内存的并发」,没有竞争的大概性以是不必要锁,也就不存在死锁的题目。
Flutter异步编程-Isolate
13、Flutter 中的生命周期
13.1 statefulWidget
1、initState→didChangeDependence→build→didupdateDependence→deactivate→dispose
2、initState:只调用一次,widget创建实验的第一个方法,这里可以做初始化工作,不如初始化state变量。
3、didChangeDependence:多次调用。
1、initState调用
2、依靠的InheritedWidget rebuild会被调用。
3、build:多次调用
1、initState调用
2、setState触发的时间调用
4、didupdateDependence:多次调用
组件状态改变的时间调用
5、deactivate:调用一次
当State对象从树中被移除,会调用此回调,会在dispose之前调用。
页面烧毁的时间会依次实验:deactivate → dispose
6、dispose:调用一次
当State对象从树中被永世移除时调用;通常在此方法中开释资源。
13.2 statelessWidget
1、builde
2、update
14、flutter和RN
flutter与RN的雷同点:
1.都是移动开发跨台办理方案
2.界面的编写都接纳相应式视图,维护了一个状态机,只更新改变的最小区域界面
3.都支持热重载hot reload,开发调试非常方便
4.调用体系的service仍然必要封装接口,仍然照旧必要懂得native开发
flutter与RN 的区别:
- 性能方面:
Flutter由于是基于Dart语言, 以是克制了RN的那种通过桥接器与Javascript通讯导致服从低下的题目,以是在性能方面比RN更高一筹,会更靠近原生的体验.
- 学习本钱方面:
Flutter是基于Dart语言,相对来说,由于要学习一门新的开发语言以是学习本钱比力高, 而RN接纳JS语言开发,基于React,对前端工程师更友好.
- UI 样式方面:
flutter实现跨平台接纳了更为彻底的方案, 由于它基于canvas本身实现了一套UI框架, 以是兼容性更好, 而 RN 在在样式方面照旧会遇到比力多的题目,且办理起来会有点贫苦.
4.成熟度的方面:
React Native 是在 2015 年发布的,颠末 3 年多的发展,已经比力成熟, 固然也还不美满, 但是Flutter 是在本年 6 月份才推出发布预览版,社区也刚刚发展, 在github上尚有两千多个待办理的题目,以是flutter必要更多时间。
flutter的有一套本身的UI框架,以是兼容性更好,且由于RN必要桥接器和JavaScript通讯,导致服从低下,flutter更靠近原生体验。
15、Flutter 线程管理模子 (待增强)
Flutter Engine层会创建一个Isolate,而且Dart代码默认就运行在这个主Isolate上。须要时可以利用spawnUri和spawn两种方式来创建新的Isolate,在Flutter中,新创建的Isolate由Flutter举行同一的管理。
毕竟上,Flutter Engine本身不创建和管理线程,Flutter Engine线程的创建和管理是Embeder负责的,Embeder指的是将引擎移植到平台的中央层代码。
Flutter 中存在的四大线程:分别为 UI Runner、GPU Runner、IO Runner, Platform Runner (原生主线程) ,在 Flutter 中可以通过 isolate 大概 compute 实验真正的跨线程异步操作。
16、Flutter状态管理
Flutter的状态可以分为全局状态和局部状态两种。
常用的状态管理都是基于InheritedWidget封装的用于Widget树的数据转达与共享的的一套框架。
Provider是继承于InheritProvider,而InheritProvider本质上是一个InheritWidget,以是Provider本质上是依托于InheritProvider的机制来实现的widget树的状态共享。
总结:Provider本质上是依托于InheritProvider的机制来来实现widget树的共享。
17、isolate是怎么举行通讯和实例化的?
1、isolate是一个隔离Dart实验的上下文情况。
2、isolate有本身的内容和单线程控制的事故循环。
3、isolate之间的内存逻辑上是隔离的,不共享内存。
4、任何Dart步伐的并发都是运行多个isolate的效果。Dart没有共享内存的并发,以是不存在死锁题目。
isolate线程之间的通讯主要通过port来举行,这个port消息转达过程是异步的。
18、Future照旧isolate场景分析?
1、假如一段代码不会被停止,那么就直接利用正常的同步实验就行。
2、假如代码段可以独立运行而不会影相应用步伐的流畅性,发起利用 Future (必要泯灭几毫秒时间)
3、假如繁重的处理处罚大概要花一些时间才气完成,而且会影相应用步伐的流畅性,发起利用 isolate (必要几百毫秒)
利用 isolate 的具体场景:
1、JSON剖析: 解码JSON,这是HttpRequest的效果,大概必要一些时间,可以利用封装好的 isolate 的 compute 顶层方法。
2、加解密: 加解密过程比力耗时
3、图片处理处罚: 比如裁剪图片比力耗时
4、从网络中加载大图
19、Flutter 是怎样与原生Android、iOS举行通讯的?(重点相识)
Flutter 通过 PlatformChannel 与原生举行交互,此中 PlatformChannel 分为三种:
BasicMessageChannel :用于转达字符串和半布局化的信息。
MethodChannel :用于转达方法调用(method invocation)。
EventChannel : 用于数据流(event streams)的通讯。
20、Flutter 绘制流程
GPU的VSync信号同步到UI线程,UI线程利用Dart来构建抽象视图布局。然后,这些数据布局在GPU中举行图层合成,视图数据提供给 Skia引擎渲染为 GPU数据,这些数据通过 OpenGL大概 Vulkan提供给 GPU。
21、PlatformView
platform view 就是 AndroidView 和 UIKitView 的总称,答应将 native view 嵌入到了 flutter widget 体系中,完成 Dart 代码对 native view 的控制。
链接:https://www.jianshu.com/p/9306d7ecde35
22、Flutter的理念架构
1、Framework层则是利用Dart编写的一套底子视图库,包罗了动画、图形绘制和手势辨认等功能,是利用频率最高的一层。
2、Engine层负责图形绘制、笔墨排版和提供Dart运行时,Engine层具有独立捏造机,正是由于它的存在,Flutter步伐才气运行在差异的平台上。
3、Embedder是操作体系适配层,实现了渲染。
参考:https://www.jianshu.com/p/9064a68a05ae
23、flutter的key和context
1、key:是flutter用来标记widget的唯一标识。
- Local Key(局部key):分为Value Key、Object Key和Unique Key,必须要有唯一性。
Local Key顾名思义,指的是在当前Widget层级下,有唯一的Key属性。可以用int大概string来体现。
1.1 Value Key利用事例如下
利用门生的学号大概身份证号等唯一的标识来标识。
1.2 Object Key
通过对比对象的所在来判断是否雷同,下同new了两次Student,以是key是差异的,假如利用同一个对象就会报错。
1.3 Unique Key
着实找不到什么标识的话我们可以利用UniqueKey来举行标记,自动生成唯一的key。
- Global Key (全局key):在全局APP中,具有唯一性。Global Key的性能会比Local Key差许多。
Global Key利用场景,一是让widget在Widget Tree发生大幅改动的时间仍然保留状态,二是像JavaScript内里getElementById那样查找某个元素并得到它的各种信息。
final _globalKey1 = GlobalKey ();final _globalKey2 = GlobalKey ();
获取全局的数据信息:
2、context:是指widget在Widget树中的具体位置,flutter就是根据context包罗的信息,来绘制widget及其对应的位置。
24、Flutter 空安全
空安全(Sound null safety)是Flutter 更新之后 Dart 中新增的一项特性,swift语言也有此特性。有了空安全,Dart 分析器可以举行更好的查抄。与空安全相关的新操作符和关键字有 ?、!。
在空安全之前,是可以直接赋值为null,且可以通过编译,这个就说空安全与之前最大的差异,而且是在编译阶段就直接报非常错误。
在利用空安全的情况下,我们想让变量赋值为null时,我们可以如许处理处罚:
int? count = null; String? name = null;只需在范例后面添加 ? 即可范例后面跟操作符 ? 体现当前变量可为null。总结:
操作符 ? :放在范例后面体现当前变量可为null,例如 String a 和 String ? b ,a 不能为null,而 b 可以。
操作符 !:体现此变量值不为null,假如为null则会抛出非常。利用请慎重思量。
25、flutter和原生交互传参的方式
Flutter和Xcode混编
重点总结:
1、flutter调用OC传参,必要利用MethodChannel
1、flutter内部点击事故传参
// 用于调用原生方法 "hometestmethod"标识符与OC中的监听标识符保持划一 var homechannelmethod = MethodChannel("hometestmethod");// 点击 onTap: (){ //给原生发送消息并传入参数,原生根据标识homePageCallNativeMethond来做对应的处理处罚 homechannelmethod.invokeMethod('homePageCallNativeMethond',{"key":"value","key1":"value1"}); },2、OC担当传参
// 1.创建方法通道对象,用于监听flutter调用原生时的回调,唯一标识“hometestmethod”与flutter要保持划一 FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName"hometestmethod" binaryMessenger:flutterViewController.binaryMessenger]; //2. 设置监听回调block,flutter端通过通道调用原生方法时会进入以下回调 [channel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) { //call的属性method是flutter调用原生方法的方法名,我们举行字符串判断然后写入差异的逻辑 if ([call.method isEqualToString"homePageCallNativeMethond"]) { //flutter传给原生的参数 id para = call.arguments; NSLog(@"flutter传给原生的参数:%@", para); //可以做界面跳转 [self.navigationController pushViewController:[TestViewController new] animated:YES]; //获取一个字符串 NSString *nativeFinalStr = @"原生给flutter回传的值"; if (nativeFinalStr!=nil) { //把获取到的字符串传值给flutter result(nativeFinalStr); }else{ //非常(比如改方法是调用原生的getString获取一个字符串,但是返回的是nil(空值),这显然是不对的,就可以向flutter抛出非常 进入catch处理处罚) result([FlutterError errorWithCode"001" message:[NSString stringWithFormat"进入非常处理处罚"] details"进入flutter的trycatch方法的catch方法"]); } }else{ //调用的方法原生没有对应的处理处罚 抛出未实现的非常 result(FlutterMethodNotImplemented); } }];2、OC调用FLuttter传参,必要调用EventChannel,通过署理传参。
//1. 创建事故通道对象,唯一标识 “hometest”,到时flutter是根据该标识来监听原生发送给flutter的参数信息 FlutterEventChannel *evenChannel = [FlutterEventChannel eventChannelWithName"hometest" binaryMessenger:flutterViewController.binaryMessenger]; //2. 当原生跳往flutter时会触发下面的- (FlutterError *)onListenWithArgumentsid)arguments eventSinkFlutterEventSink)events回调方法,可以在该方法中给flutter转达参数 [evenChannel setStreamHandler:self];//原生跳转flutter时,会触发该方法,在该方法中可以转达参数给flutter界面,必要留意的是flutter代码中必须写上对应的监听代码,这里才会被实验- (FlutterError *)onListenWithArgumentsid)arguments eventSinkFlutterEventSink)events{ if (events) { events(@{@"key""value"}); } return nil;}26、当地数据存储方式
文件、sharedPreferences、sqlite数据库
和原生通讯方式
Flutter界说了三种差异范例的channel,分别是
eventChannel:用于数据流畅信,原生向Flutter传参,通过署理eventSink传参。
methodChannel:flutter向原生传参。界说好方法名
BaseMessageChannel:未利用
27、键盘高度超出办理
Scaffold(
resizeToAvoidBottomPadding: false, //输入框抵住键盘
)
28、ListView报Vertical viewport was given unbounded height错误办理方法
缘故起因:宽高溢出。导致widget不表现
办理:给ListView的shrinkWrap属性设置为ture(紧缩)。父视图的巨细跟随子组件内容巨细。
29、Flutter报setState() or markNeedsBuild() called during build.错误办理办法
错误缘故起因:在运行中,控件和相应事故没有构建完,延时加载就可办理题目
办理方法:利用Future延时
void _addIndex() { Future.delayed(Duration(milliseconds: 200)).then((e) { setState(() {});});}}30、Flutter报setState() called after dispose()错误办理办法
错误剖析:防止页面关闭实验setState()方法
办理方法:mounted, mounted 表明 State 当前是否精确绑定在View树中。State的生命周期内里,这个 mounted 属性不会改变,直至 framework 调用 State.dispose,当改变之后, State 对象再也不会调用 build 方法 mounted = false。
31、实现水波纹
InkWell
32、安卓和iOS 控件区别
Flutter提供了两种差异风格安卓的Material 和 iOS的Cupertino风格
33、StatelessWidget的生命周期有哪些,请按生命周期次序说一下?
只有build,update。
34、Flutter是怎么实现热重载的,说说具体实现原理?
Flutter的 Debug 模式支持 JIT(Just In Time),指的是即时编译或运行时编译,
JIT 编译器将 Dart 代码编译成可以运行在 Dart VM 上的 Dart Kernel, Dart Kernel可以动态更新。
35、为什么说Flutter的性能好,与RN的区别?
1、flutter没有桥接层。
2、自带渲染引擎。skia
3、编译实验。JS是表明实验。
4、Flutter Engine捏造机
36、Flutter中是怎么实现并发操作的?
两种方式:isolate 和 Future
Future:短时间的几毫秒。
isolate:长时间几百毫秒
37、isolate是怎么举行通讯和实例化的?
通讯:通过port实现通讯,sendPort和reservePort,这个port消息转达过程是异步的。
实例化: Isolate isolate =await Isolate.spawn<SendPort>(dataLoader, mainThreadPort.sendPort);
重点,深刻剖析: https://www.bbsmax.com/A/kjdwe1NBJN/
38、Future和isolate有什么区别?
Future: 是一个异步实验而且在将来的某一个时候完成(或失败)的使命。Future本质上 并非并行实验,而是遵照事故循环处理处罚事故的次序规则实验。
isolate:为了并行运行代码。每个isolate都有本身的事故循环。
总结:
- 假如一个方法必要几毫秒利用Future
- 假如一个处理处罚流程必要几百毫秒利用isolate
利用isolate场景:
- JSON解码
- 加密
- 图像处理处罚:裁剪
- 从web加载图像
39、Stream与Future是什么关系?
Future:只能吸取一次返回的数据
Stream:吸取多次返回的数据。flutter就是基于Stream流的处理处罚。
40、setState是同步照旧异步操作
setState是异步操作。下面代码的打印先输出2然后在输出1.
onChangedvalue) async{ setState(){ print('1111111') ; } print('222222') ;}41、setState无效
Flutter开发App时,偶然会遇到SetState()不起作用或界面更新不完全的Bug,是什么缘故起因导致的呢?
比如在弹窗中点击,标记对号。我们是利用体系的弹窗SimpleDialog来展示,但是点击之后标记框状态没有改变,这是为什么呢?由于SimpleDialog是无状态组件,要办理题目,我们必要包裹StateFulBuilder 如下:
|