1. Dart中var与dynamic的区别:
使用var来声明变量,dart会在编译阶段自动推导出类型。而dynamic不在编译期间做类型检查而是在运行期间做类型校验。
2. const和final的区别:
const 的值在编译期确定,final 的值在运⾏时确定。
3. Dart中??与??=的区别:
两者都是dart中的操作符,??表示如果为空则返回,??=表示如果为空则赋值。例如:
String a;
String b = a ?? "1";
print(b);//打印结果:1
print(a);//打印结果:null
a ??= "2";
print(a);//打印结果:2
4. Flutter中的GlobalKey是什么,有什么作用?
Globalkey可以主动获取以及主动改变子控件的状态。
5. Widget、Element、RenderObject三者之间的关系:
Widget不是真正渲染UI的对象,它只是Element的一个配置描述,去告知Element应该如何去渲染,Widget 和 Element 之间是 ⼀对多的关系 。RenderObject才是实际渲染的对象,Element 持有 RenderObject 和 Widget。⼤致总结三者的关系是:配置⽂件 Widget ⽣成了 Element,⽽后创建 RenderObject 关联到 Element 的内部 renderObject 对象上,最后Flutter 通过 RenderObject 数据来布局和绘制。
6. 通过BoxDecoration和ClipRRect设置圆角有什么区别?
使用BoxDecoration设置圆角不会影响其child控件,也就是如果child是图片或者也有背景色的话那么圆角效果就失效了。而ClipRRect是会影响到child的,加了圆角后,也会约束到child产生圆角效果。
7. 阐述state的生命周期:
- initState:state创建初始化时调用,表示state将和一个BuildContext产生关联,需要注意的是此时BuildContext还没有完全加载完成,如果需要获取BuildContext及监听第一次build完成可以在下面回调中获取
widgetsBinding=WidgetsBinding.instance;
widgetsBinding.addPostFrameCallback((callback){
print("addPostFrameCallback be invoke");
});
- didChangeDependencies:在 initState() 之后调⽤,当 State 对象的依赖关系发⽣变化时,该⽅法被调⽤,初始化时也会调⽤。
- deactivate:当state暂时在视图树种移除时被调用,页面切换时也会调用。
- dispose:state销毁时调用,在调用此方法之前会先调用deactivate()。
-
didUpdateWidget:当widget状态发生变化时调用。
8. Flutter与原生通信的Channel有哪几种?
Flutter定义了三种不同类型的Channel,它们分别是:
BasicMessageChannel:用于传递字符串和半结构化的信息。
MethodChannel:用于传递方法调用(method invocation)。
EventChannel: 用于数据流(event streams)的通信。
9.介绍下 Flutter 的优缺点:
(1)优点
• 热重载(Hot Reload),利用 Android Studio 直接一个 ctrl+s 就可以保存
并重载,模拟器立马就可以看见效果,相比原生冗长的编译过程强很多;
• 一切皆为 Widget 的理念,对于 Flutter 来说,手机应用里的所有东西都是Widget,通过可组合的空间集合、丰富的动画库以及分层课扩展的架构实现了富有感染力的灵活界面设计;
• 借助可移植的 GPU 加速的渲染引擎以及高性能本地代码运行时以达到跨平台设备的高质量用户体验。 简单来说就是:最终结果就是利用 Flutter 构建应用在运行效率上会和原生应用差不多。
(2)缺点
• 不支持热更新;
• 三方库有限,需要自己造轮子;
• Dart 语言编写,增加了学习难度,并且学习了 Dart 之后无其他用处,相比
JS 和 Java 来说。
10.简述 Widget 的 StatelessWidget 和StatefulWidget 两种状态组件类。
• StatelessWidget: 一旦创建就不关心任何变化,在下次构建之前都不会改变。它们除了依赖于自身的配置信息(在父节点构建时提供)外不再依赖于任何其他信息。比如典型的 Text、Row、Column、Container 等,都是StatelessWidget。它的生命周期相当简单:初始化、通过 build()渲染。
• StatefulWidget: 在生命周期内,该类 Widget 所持有的数据可能会发生变化,这样的数据被称为 State,这些拥有动态内部数据的 Widget 被称为 StatefulWidget。比如复选框、Button 等。State 会与 Context 相关联,并且此关联是永久性的,State 对象将永远不会改变其 Context,即使可以在树结构周围移动,也仍将与该 context 相关联。当 state 与 context关联时,state 被视为已挂载。StatefulWidget 由两部分组成,在初始化时必须要在 createState()时初始化一个与之相关的 State 对象。
11.Flutter在Debug和Release下分别使用什么编译模式,有什么区别?
Debug模式下使用JIT编译模式,即Just in time(即时编译),Release下使用AOT模式,即Ahead of time(提前编译)。JIT模式因为需要边运行边编译,所以会占用运行时内存,导致卡顿现象,但是有动态编译效果对于开发者来说非常方便调试。AOT模式提前编译不会占用运行时内存,相对来说运行流畅,但是会导致编译时间增加。
12.Flutter出现异常时如何友好的提示用户?
使用ErrorWidget.builder进行全局设置自定义界面即可。
更多好文可前往掘金主页查看掘进主页