Flutter面试基础

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 (messagereply) :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 对象的状态,并在不同的状态下执行相应的操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容