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 (message,reply) :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í)行相應的操作。