1.Dart 语言的特性?
- Productive(生产力高,Dart的语法清晰明了,工具简单但功能强大)
- Fast(执行速度快,Dart提供提前优化编译,以在移动设备和Web上获得可预测的高性能和快速启动。)
- Portable(易于移植,Dart可编译成ARM和X86代码,这样Dart移动应用程序可以在iOS、Android和其他地方运行)
- Reactive(响应式编程)
2.Dart 的单线程模型是如何运行的?
3.Future和Isolate有什么区别?
future是异步编程,调用本身立即返回,并在稍后的某个时候执行完成时再获得返回结果。在普通代码中可以使用await 等待一个异步调用结束。
isolate是并发编程,Dartm有并发时的共享状态,所有Dart代码都在isolate中运行,包括最初的main()。每个isolate都有它自己的堆内存,意味着其中所有内存数据,包括全局数据,都仅对该isolate可见,它们之间的通信只能通过传递消息的机制完成,消息则通过端口(port)收发。isolate只是一个概念,具体取决于如何实现,比如在Dart VM中一个isolate可能会是一个线程,在Web中可能会是一个Web Worker。
4.Stream 与 Future是什么关系?
Stream 和 Future 是 Dart 异步处理的核心 API。
区别:
- Future 只能表示一次异步获得的数据。而 Stream 表示多次异步获得的数据。
- Future将返回一个值,而Stream将返回多次值。
- Dart 中统一使用 Stream 处理异步事件流,用Future 表示稍后获得的一个数据。
5.本地的数据存储方式
1.文件存储
使用:在pubspec.yaml引入path_provider
2.SharePreferences
主要用于缓存少量的键值对信息,SharedPreferences 会以原生平台相关的机制,为简单的键值对数据提供持久化存储,即在 iOS 上使用 NSUserDefaults,在 Android 使用 SharedPreferences。需要注意的是,以键值对的方式只能存储基本类型的数据,比如 int、double、bool 和 string。
使用:在pubspec.yaml引入shared_preferences
3.Sqlite数据库
主要用于持久化大量格式化后的数据,并且这些数据还会以较高的频率更新。
与文件和 SharedPreferences 相比,数据库在数据读写上可以提供更快、更灵活。
使用:在pubspec.yaml引入sqlfite
6.与原生通讯方式
Flutter定义了三种不同类型的Channel,它们分别是:
BasicMessageChannel:用于传递字符串和半结构化的信息。(双向有返回值)
MethodChannel:用于传递方法调用(method invocation)通常用来调用 native 中某个方法,(双向有返回值)
EventChannel: 用于数据流(event streams)的通信。有监听功能,比如电量变化之后直接推送数据给flutter端。(仅支持数据单向传递,无返回值)
iOS原生和Flutter通信的三种方式,消息传递是异步的。
使用总结:
1.Platform Channel 的代码在Flutter app侧的代码运行在UI Task Runner 线程中,而在android 和ios平台上运行在主线程上。因此 ,不应该在Platform端的Handler 中处理耗时操作。
2.Platform Channel 并非线程安全的,因此在将Platform端的消息处理结果回传到Flutter端时,需要确保回调函数是在Platform Thread(就是Android 和IOS 的主线程)中执行。
3.Platform Channel 是支持大内存数据块的传递。当需要传递大内存数据块时,需要使用BasicMessageChannel以及BinaryCodec。
7.键盘弹出高度超出解决
Scaffold(
resizeToAvoidBottomPadding: false, //输入框抵住键盘
)
8.ListView报Vertical viewport was given unbounded height错误解决方法
错误解析:宽度或高度溢出,导致Widget不显示
解决方法:给ListView的shrinkWrap属性设置为true,即父视图的大小跟随子组件的内容大小
return Column(
children: <Widget>[
ListView.builder(
itemCount: sourceDataComments.length,
itemBuilder: _buildCommentsRow,
shrinkWrap: true,
),
],
);
9.Flutter报setState() or markNeedsBuild() called during build.错误解决办法
错误解析:
在运行中,原因是因为控件、响应事件还没有构建完毕,延时加载即可解决问题
解决方法:添加延时
void _addIndex() {
Future.delayed(Duration(milliseconds: 200)).then((e) {
setState(() {});
});
}
}
10.Flutter报setState() called after dispose()错误解决办法
错误解析:防止页面关闭执行setState()方法
解决方法:mounted
if(mounted){
setState(() {});
}
11.如何实现水波纹,图片也怎么添加
InkWell有的叫溅墨效果,有的叫水波纹效果。使用场景是给一些无点击事件的部件添加点击事件时使用(也支持长按、双击等事件),同时你也可以去修改它的颜色和形状。
12.Android和IOS控件区别
如:按钮、选择器、日历组件(Android的Material和iOS的Cupertino风格)
13.生命周期输出顺序
在 Flutter应用程序中,生命周期涉及两个:
一个是 Widget的生命周期,
一个是应用程序的生命周期。
一、Widget 的生命周期
Flutter 里的 Widget 分为 StatelessWidget 和 StatefulWidget 两种:
1.StatelessWidget
StatelessWidget 的生命周期只有一个也就是build ,build 是用来创建要显示的页面 的。
2.StatefulWidget
StatefulWidget 有一个createState 方法,StatefulWidget 的生命周期主要包含在创建的State里面。
第一部分:表示的是初始化显示页面的时候执行的生命周期,主要是:
- initState
- didChangeDependencies
- build
第二部分:调用setState 刷新页面的时候执行的生命周期,主要是:
- didUpdateWidget
- build<