flutter一些简单的认识

本文详细介绍了Flutter开发中的关键概念,包括Dart语言的生产力特性、单线程模型、Future与Isolate的区别、Stream与Future的关系,以及本地数据存储方式如文件、SharedPreferences和SQLite。此外,文章还探讨了Flutter与原生应用的通信、键盘弹出高度问题、ListView错误解决以及错误处理策略。同时,讲解了Widget、Element和RenderObject的关系、Navigator的用途和状态管理。最后,讨论了Dart的异步处理、线程管理和热重载技术,以及Flutter的性能优化和优势。
摘要由CSDN通过智能技术生成

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<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值