1.StatelessWidget和StatefulWidget区别
状态管理:
StatelessWidget:无状态组件,意味着它们没有内部状态需要管理。它们的UI一旦构建完成就不会因为内部状态的变化而重新构建。
StatefulWidget:有状态组件,持有一个或多个状态,这些状态可以在组件的生命周期内改变。当状态变化时,StatefulWidget会重新构建其UI以反映最新的状态。
生命周期:
StatelessWidget:生命周期简单,主要包括build方法,该方法用于构建UI。由于StatelessWidget没有状态,所以它在每次需要渲染时都会调用build方法,但并不会因为内部状态的变化而重新构建。
StatefulWidget:生命周期较为复杂,包括createState、initState、didChangeDependencies、build、didUpdateWidget、deactivate、dispose等方法。其中,build方法用于构建UI,而状态的变化通过setState方法触发,导致build方法被重新调用以更新UI。
性能考虑:
StatelessWidget:由于它们没有状态,因此在性能上通常更优,因为它们不需要在状态变化时重新构建UI。
StatefulWidget:虽然提供了更高的灵活性,但在状态频繁变化时可能会导致性能下降,因为每次状态变化都需要重新构建UI。
适用场景:
StatelessWidget:适用于那些不需要改变状态的静态UI元素。例如,文本标签、图标、静态图片等。这些元素的内容在构建后不会发生变化,因此使用StatelessWidget可以简化代码并提高性能。
StatefulWidget:适用于那些需要改变状态的动态UI元素。例如,用户登录表单、动画效果、可交互的按钮等。这些元素的状态会随着用户输入、时间流逝或其他条件的变化而变化,因此需要使用StatefulWidget来管理这些状态并更新UI。
StatelessWidget和StatefulWidget是Flutter中两种重要的Widget类型,它们的主要区别在于是否能够携带和管理状态。StatelessWidget适用于静态UI元素,而StatefulWidget则适用于需要动态更新状态的UI元素。在选择使用哪种Widget时,应根据具体需求和UI的复杂性来决定。
2.Flutter与原生通信的方式
MethodChannel:用于方法的传递,允许有返回值,适用于一次通信
BasicMessageChannel:用于传递字符串或是半结构化的消息,可持续通信
EventChannel:用于事件流的发送,可持续通信 但是不可回复
三种Channel之间互相独立,各有用途,但它们在设计上却非常相近。每种Channel均有三个重要成员变量:
name: String类型,代表Channel的名字,也是其唯一标识符。
messager:BinaryMessenger类型,代表消息信使,是消息的发送与接收的工具。
codec: MessageCodec类型或MethodCodec类型,代表消息的编解码器。
MethodChannel->MethodCallHandler->onMethodCall (MethodCall,result) :result.success("安装调用成功"),result.notImplemented(),result.error("错误码","错误信息","错误详情")
BasicMessageChannel->MessageHandler->onMessage (message,reply) :reply.reply("成功")
EventChannel->StreamHandler->onListen->onCancel? (arguments,EventSink) :eventSink.success("成功"),eventSink.endOfStream(),eventSink.error("","","")
MessageCodec有多种不同的实现:
BinaryCodec
BinaryCodec是最为简单的一种Codec,因为其返回值类型和入参的类型相同,均为二进制格式(Android中为ByteBuffer,iOS中为NSData)。实际上,BinaryCodec在编解码过程中什么都没做,只是原封不动将二进制数据消息返回而已。使用BinaryCodec可以使传递内存数据块时在编解码阶段免于内存拷贝。
StringCodec
StringCodec用于字符串与二进制数据之间的编解码,其编码格式为UTF-8
JSONMessageCodec
JSONMessageCodec用于基础数据与二进制数据之间的编解码,其支持基础数据类型以及列表、字典。其在iOS端使用了NSJSONSerialization作为序列化的工具
StandardMessageCodec
StandardMessageCodec是BasicMessageChannel的默认编解码器,其支持基础数据类型、二进制数据、列表、字典
MethodCodec有两种实现:
JSONMethodCodec
JSONMethodCodec的编解码依赖于JSONMessageCodec,当其在编码MethodCall时,会先将MethodCall转化为字典{“method”:method,“args”:args}。其在编码调用结果时,会将其转化为一个数组,调用成功为[result],调用失败为[code,message,detail]。再使用JSONMessageCodec将字典或数组转化为二进制数据
StandardMethodCodec
MethodCodec的默认实现,StandardMethodCodec的编解码依赖于StandardMessageCodec,当其编码MethodCall时,会将method和args依次使用StandardMessageCodec编码,写入二进制数据容器。其在编码方法的调用结果时,若调用成功,会先向二进制数据容器写入数值0(代表调用成功),再写入StandardMessageCodec编码后的result。而调用失败,则先向容器写入数据1(代表调用失败),再依次写入StandardMessageCodec编码后的code,message和detail。
异步编程:Future、async、await
返回值: Future 对象可以返回任何类型的值,例如 String、List、Map 等。
状态: Future 对象有三种状态:
pending: 异步操作正在进行中。
completed: 异步操作已完成,并返回结果。
error: 异步操作发生错误,并抛出异常。
监听: 可以使用 then、catchError、whenComplete 等方法监听 Future 对象的状态,并在不同的状态下执行相应的操作。