Flutter底子知识

开发者 2024-10-6 03:13:47 56 0 来自 中国
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.png
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是差异的,假如利用同一个对象就会报错。

3.png 1.3 Unique Key

着实找不到什么标识的话我们可以利用UniqueKey来举行标记,自动生成唯一的key。

4.png

  • 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、当地数据存储方式

文件、sharedPreferencessqlite数据库
和原生通讯方式
Flutter界说了三种差异范例的channel,分别是
eventChannel:用于数据流畅信,原生向Flutter传参,通过署理eventSink传参。
methodChannelflutter向原生传参。界说好方法名
BaseMessageChannel:未利用
27、键盘高度超出办理

Scaffold(
resizeToAvoidBottomPadding: false, //输入框抵住键盘
)
28、ListViewVertical 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、FluttersetState() called after dispose()错误办理办法

错误剖析:防止页面关闭实验setState()方法
办理方法:mounted, mounted 表明 State 当前是否精确绑定在View树中。State的生命周期内里,这个 mounted 属性不会改变,直至 framework 调用 State.dispose,当改变之后, State 对象再也不会调用 build 方法 mounted = false。
31、实现水波纹

InkWell
32、安卓和iOS 控件区别

Flutter提供了两种差异风格安卓的MaterialiOSCupertino风格
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 如下:

您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 01:51, Processed in 0.162833 second(s), 36 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表