Flutter面試基礎

1.StatelessWidget和StatefulWidget區(qū)別

狀態(tài)管理:

StatelessWidget:無狀態(tài)組件,意味著它們沒有內部狀態(tài)需要管理。它們的UI一旦構建完成就不會因為內部狀態(tài)的變化而重新構建。

StatefulWidget:有狀態(tài)組件,持有一個或多個狀態(tài),這些狀態(tài)可以在組件的生命周期內改變。當狀態(tài)變化時,StatefulWidget會重新構建其UI以反映最新的狀態(tài)。

生命周期:

StatelessWidget:生命周期簡單,主要包括build方法,該方法用于構建UI。由于StatelessWidget沒有狀態(tài),所以它在每次需要渲染時都會調用build方法,但并不會因為內部狀態(tài)的變化而重新構建。

StatefulWidget:生命周期較為復雜,包括createState、initState、didChangeDependencies、build、didUpdateWidget、deactivate、dispose等方法。其中,build方法用于構建UI,而狀態(tài)的變化通過setState方法觸發(fā),導致build方法被重新調用以更新UI。

性能考慮:

StatelessWidget:由于它們沒有狀態(tài),因此在性能上通常更優(yōu),因為它們不需要在狀態(tài)變化時重新構建UI。

StatefulWidget:雖然提供了更高的靈活性,但在狀態(tài)頻繁變化時可能會導致性能下降,因為每次狀態(tài)變化都需要重新構建UI。

適用場景:

StatelessWidget:適用于那些不需要改變狀態(tài)的靜態(tài)UI元素。例如,文本標簽、圖標、靜態(tài)圖片等。這些元素的內容在構建后不會發(fā)生變化,因此使用StatelessWidget可以簡化代碼并提高性能。

StatefulWidget:適用于那些需要改變狀態(tài)的動態(tài)UI元素。例如,用戶登錄表單、動畫效果、可交互的按鈕等。這些元素的狀態(tài)會隨著用戶輸入、時間流逝或其他條件的變化而變化,因此需要使用StatefulWidget來管理這些狀態(tài)并更新UI。

StatelessWidget和StatefulWidget是Flutter中兩種重要的Widget類型,它們的主要區(qū)別在于是否能夠攜帶和管理狀態(tài)。StatelessWidget適用于靜態(tài)UI元素,而StatefulWidget則適用于需要動態(tài)更新狀態(tài)的UI元素。在選擇使用哪種Widget時,應根據具體需求和UI的復雜性來決定。

2.Flutter與原生通信的方式

MethodChannel:用于方法的傳遞,允許有返回值,適用于一次通信

BasicMessageChannel:用于傳遞字符串或是半結構化的消息,可持續(xù)通信

EventChannel:用于事件流的發(fā)送,可持續(xù)通信 但是不可回復

三種Channel之間互相獨立,各有用途,但它們在設計上卻非常相近。每種Channel均有三個重要成員變量:

name: String類型,代表Channel的名字,也是其唯一標識符。

messager:BinaryMessenger類型,代表消息信使,是消息的發(fā)送與接收的工具。

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有多種不同的實現(xiàn)

BinaryCodec

BinaryCodec是最為簡單的一種Codec,因為其返回值類型和入參的類型相同,均為二進制格式(Android中為ByteBuffer,iOS中為NSData)。實際上,BinaryCodec在編解碼過程中什么都沒做,只是原封不動將二進制數(shù)據消息返回而已。使用BinaryCodec可以使傳遞內存數(shù)據塊時在編解碼階段免于內存拷貝。

StringCodec

StringCodec用于字符串與二進制數(shù)據之間的編解碼,其編碼格式為UTF-8

JSONMessageCodec

JSONMessageCodec用于基礎數(shù)據與二進制數(shù)據之間的編解碼,其支持基礎數(shù)據類型以及列表、字典。其在iOS端使用了NSJSONSerialization作為序列化的工具

StandardMessageCodec

StandardMessageCodec是BasicMessageChannel的默認編解碼器,其支持基礎數(shù)據類型、二進制數(shù)據、列表、字典

MethodCodec有兩種實現(xiàn):

JSONMethodCodec

JSONMethodCodec的編解碼依賴于JSONMessageCodec,當其在編碼MethodCall時,會先將MethodCall轉化為字典{“method”:method,“args”:args}。其在編碼調用結果時,會將其轉化為一個數(shù)組,調用成功為[result],調用失敗為[code,message,detail]。再使用JSONMessageCodec將字典或數(shù)組轉化為二進制數(shù)據

StandardMethodCodec

MethodCodec的默認實現(xiàn),StandardMethodCodec的編解碼依賴于StandardMessageCodec,當其編碼MethodCall時,會將method和args依次使用StandardMessageCodec編碼,寫入二進制數(shù)據容器。其在編碼方法的調用結果時,若調用成功,會先向二進制數(shù)據容器寫入數(shù)值0(代表調用成功),再寫入StandardMessageCodec編碼后的result。而調用失敗,則先向容器寫入數(shù)據1(代表調用失敗),再依次寫入StandardMessageCodec編碼后的code,message和detail。


編碼解碼

異步編程:Future、async、await

返回值: Future 對象可以返回任何類型的值,例如 String、List、Map 等。

狀態(tài): Future 對象有三種狀態(tài):

pending: 異步操作正在進行中。

completed: 異步操作已完成,并返回結果。

error: 異步操作發(fā)生錯誤,并拋出異常。

監(jiān)聽: 可以使用 then、catchError、whenComplete 等方法監(jiān)聽 Future 對象的狀態(tài),并在不同的狀態(tài)下執(zhí)行相應的操作。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容