本文小編為大家詳細介紹“Android開發中dart是值傳遞還是引用傳遞”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Android開發中dart是值傳遞還是引用傳遞”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
專注于為中小企業提供做網站、成都做網站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業蕭縣免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了成百上千企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
說實話,第一個、第三個、第六個我準備的話應該能答出來的,但是一個多月沒碰 Flutter 了,忘了都差不多。。。等下把二面的答案寫出來,希望能幫助后來人。此外 GitHub 和博客維護好很重要,像我這種 demo 隨手寫,隨手刪的人直接 GG。。
1. dart 是值傳遞還是引用傳遞
首先給個結論,dart 是引用傳遞。先來看段代碼
main(){
Test a = new Test(5);
print("a 的初始值為:${a.value}");
setValue(a);
print("修改后 a 的值為: ${a.value}");
}
class Test{
int value = 1;
Test(int newValue){
this.value = newValue;
}
}
setValue(Test s){
print("修改 value 為 100");
s.value = 100;
}
輸出結果為:
a 的初始值為:5
修改 value 為 100
修改后 a 的值為:100
從這里可以看出是引用傳遞,如果只是復制了一個對象的話,main 函數中的 a 值是不會發生變化的。
有些人可能會以以下代碼反駁我:
main(){
int s = 6;
setValue(s);
print(s); //輸出 6,而不是 7
}
class Test{
int value = 1;
Test(int newValue){
this.value = newValue;
}
}
setValue(int s){
s += 1;
}
你看,這輸出的不是 6 嗎,在 dart 中一切皆為對象,如果是引用傳遞,那為什么是 6 啊。
答案是這樣的,在 setValue() 方法中,參數 s 實際上和我們初始化 int s = 6 的 s 不是一個對象,只是他們現在指的是同一塊內存區域,然后在 setValue() 中調用 s += 1 的時候,這塊內存區域的對象執行+1 操作,然后在堆 (類比 java) 中產生了一個新的對象,s 再指向這個對象。所以 s 參數只是把 main 函數中的 s 的內存地址復制過去了,就比如 java 中的:
public class Test {
public static void main(String[] args) {
Test a = new Test();
Test b = a;
b = new Test();
}
}
我們只要記住一點,參數是把內存地址傳過去了,如果對這個內存地址上的對象修改,那么其他位置的引用該內存地址的變量值也會修改。千萬要記住 dart 中一切都是對象。
偷偷說一句,我覺得面試官這個地方面試的不好,這種細節問題,如果不是遇到什么 bug,業務忙的時候是沒時間注意這個的,面試官可以把這兩種情況展示下,然后問面試者原因是什么。。然后我就能回答出來了。。哭唧唧。。
2. Widget 和 element 和 RenderObject 之間的關系
首先我詳細說下當時的情景,面試官問我 Widget 和 Element 之間是不是一對多的關系,如果是增加一個 Widget 之后,這個關系又是什么。
這部分還是沒有很好地答案,現在只是一個猜想,如果添加了一個 widget,Element 樹遍歷后面所有的 Element 看類型是否發生改變,有的話再重建 RenderObject。
Element 和 Widget 之間應該還是一對一的關系,因為每個 Widget 的 context 都是獨一無二的。等想好了再寫上去吧。
3. widget 樹的 root 節點
還是沒能理解面試官的意思。。有能夠理解的同學請評論告知我一下。現在理解了,面試官的意思應該指是 runApp() 方法中的那個的 Widget。我當時也想說的不過忘記這個方法名是啥了。。。
4. mixin extends implement 之間的關系
這部分可以參考掘金的小德大佬的文章,高產似那啥。。Flutter Dart mixins 探究 Flutter Dart 語法 (1):extends 、 implements 、 with 的用法與區別
6. Future 和 microtask 執行順序同樣參考小德的文章深入了解 Flutter 的 isolate(1) ---- 事件循環 (event loop) 及代碼運行順序深入了解 Flutter 的 isolate(2) --- 創建自己的 isolate 深入了解 Flutter 的 isolate(3) --- Flutter 的 thread model(線程模型)深入了解 Flutter 的 isolate(4) --- 使用 Compute 寫 isolates
7. dart 中..是什么級聯符號 .. 可以讓你連續操作相同的對象,不單可以連續地調用函數,還可以連續地訪問方法,這樣做可以避免創建臨時變量,從而寫出更流暢的代碼,流式編程更符合現代編程習慣和編程風格:
main(){
Tree tree = new Tree(1);
tree..test1 = 1..test2 =5;
print(tree.test1);
print(tree.test2);
}
class Tree{
int value;
int test1 = 2;
int test2 = 3;
Tree(int a){
this.value = a;
}
}
8. await for 使用先來一段官方文檔
await-forAs every Dart programmer knows, the for-in loop plays well with iterables. Similarly, the await-for loop is designed to play well with streams.Given a stream, one can loop over its values:Every time an element is added to the stream, the loop body is run. After each iteration, the function enclosing the loop suspends until the next element is available or the stream is done. Just like await expressions, await-for loops can only appear inside asynchronous functions.
大概意思就是 await for 是不斷獲取 stream 流中的數據,然后執行循環體中的操作。
Stream<String> stream = new Stream<String>.fromIterable([' 不開心 ', ' 面試 ', ' 沒 ', ' 過 ']);
main() async{
print(' 上午被開水燙了腳 ');
await for(String s in stream){
print(s);
}
print(' 晚上還沒吃飯 ');
}
輸出為
上午被開水燙了腳
不開心
面試
沒
過
晚上還沒吃飯
await for 和 listen 的作用很相似,都是獲取流中數據然后輸出,但是正如 await for 中的 await 所示,如果 stream 沒有傳遞完成,就會一直阻塞在這個位置,上面沒吃飯是最后輸出的,下面給個 listen 的實例,一看就懂。
Stream<String> stream = new Stream<String>.fromIterable([' 不開心 ', ' 面試 ', ' 沒 ', ' 過 ']);
main(){
print(' 上午被開水燙了腳 ');
stream.listen((s) { print(s); });
print(' 晚上還沒吃飯 ');
}
輸出為
上午被開水燙了腳
晚上還沒吃飯
不開心
面試
沒
過
所以 await for 一般用在直到 stream 什么時候完成,并且必須等待傳遞完成之后才能使用,不然就會一直阻塞,造成類似于 Android ANR 的問題。
讀到這里,這篇“Android開發中dart是值傳遞還是引用傳遞”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注創新互聯行業資訊頻道。
新聞標題:Android開發中dart是值傳遞還是引用傳遞
本文網址:http://m.newbst.com/article34/gciose.html
成都網站建設公司_創新互聯,為您提供App開發、外貿建站、定制開發、做網站、電子商務、網站設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯