千家信息网

Android开发中dart是值传递还是引用传递

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"Android开发中dart是值传递还是引用传递",内容详细,步骤清晰,细节处理妥当,希望这篇"Android开发中dart是值传递还是引用传递"文章能帮助大家解决疑惑,下面跟
千家信息网最后更新 2026年11月01日Android开发中dart是值传递还是引用传递

本文小编为大家详细介绍"Android开发中dart是值传递还是引用传递",内容详细,步骤清晰,细节处理妥当,希望这篇"Android开发中dart是值传递还是引用传递"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一面问的 Java 和 Android 基础

  1. Jvm 虚拟机
  2. messageQueue 会不会阻塞 ui 线程
  3. 对象锁和类锁
  4. 之字形打印树

二面问的 Flutter 和 Dart

  1. dart 是值传递还是引用传递
  2. Widget 和 element 和 RenderObject 之间的关系
  3. widget 的 root 节点
  4. mixin extends implement 之间的关系(除了 extends 其他的没怎么用过。。)
  5. jvm 内存模型(感觉这个是面试官可怜我,看我什么都不会才问的=。=)
  6. Future 和 microtask 执行顺序
  7. dart 中..的用法(基本没用过。。)
  8. await for(没用过。。)

说实话,第一个、第三个、第六个我准备的话应该能答出来的,但是一个多月没碰 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 stream = new Stream.fromIterable([' 不开心 ', ' 面试 ', ' 没 ', ' 过 ']);
main() async{
print(' 上午被开水烫了脚 ');
await for(String s in stream){
print(s);
}
print(' 晚上还没吃饭 ');
}

输出为

上午被开水烫了脚
不开心
面试
没
过
晚上还没吃饭

await for 和 listen 的作用很相似,都是获取流中数据然后输出,但是正如 await for 中的 await 所示,如果 stream 没有传递完成,就会一直阻塞在这个位置,上面没吃饭是最后输出的,下面给个 listen 的实例,一看就懂。

Stream stream = new Stream.fromIterable([' 不开心 ', ' 面试 ', ' 没 ', ' 过 ']);
main(){
print(' 上午被开水烫了脚 ');
stream.listen((s) { print(s); });
print(' 晚上还没吃饭 ');
}

输出为

上午被开水烫了脚
晚上还没吃饭
不开心
面试
没
过

所以 await for 一般用在直到 stream 什么时候完成,并且必须等待传递完成之后才能使用,不然就会一直阻塞,造成类似于 Android ANR 的问题。

读到这里,这篇"Android开发中dart是值传递还是引用传递"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

对象 还是 内存 输出 之间 文章 代码 只是 地址 开水 方法 开发 函数 参数 意思 时候 答案 顺序 编程 阻塞 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 云之行互联网科技 南京欣网互联网科技 上海喔噻互联网科技 天津摩尔互联网科技 沃里互联网科技 互联网科技小额贷款 哈尔滨新华互联网科技 科技大学互联网专业好不好 山东吉时兔互联网科技有限公司 以后互联网后是啥科技 金融科技与互联网金融相同和不同 世界互联网科技公司市值排名 湖南一路畅行互联网科技 广东工业互联网大赛深圳学泰科技 互联网硬科技公司 科技信息时代互联网发展 米泉互联网科技专业怎么样 互联网科技的前景 互联网金融金融科技 博彦科技互联网金融 互联网电商科技 互联网核心科技是什么 互联网科技的未来发展 互联网科技公司有哪些 亿人帮互联网科技 青岛中康互联网医疗科技有限公司 注册互联网科技公司经营范围大全 乌鲁木齐新华智原互联网科技学校 互联网科技包装股份有限公司上市
0