重磅!!Flutter 面试知识点集锦,2024年最新字节跳动客户端面经

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

12、getter setter 重写

Dart 中所有的基础类型、类等都继承 Object ,默认值是 NULL, 自带 getter 和 setter ,而如果是 final 或者 const 的话,那么它只有一个 getter 方法,Object 都支持 getter、setter 重写:

@override

Size get preferredSize {

return Size.fromHeight(kTabHeight + indicatorWeight);

}

13、Assert(断言)

assert 只在检查模式有效,在开发过程中,assert(unicorn == null); 只有条件为真才正常,否则直接抛出异常,一般用在开发过程中,某些地方不应该出现什么状态的判断。

14、重写运算符,如下所示重载 operator 后对类进行 +/- 操作。

class Vector {

final int x, y;

Vector(this.x, this.y);

Vector operator +(Vector v) => Vector(x + v.x, y + v.y);

Vector operator -(Vector v) => Vector(x - v.x, y - v.y);

···

}

void main() {

final v = Vector(2, 3);

final w = Vector(2, 2);

assert(v + w == Vector(4, 5));

assert(v - w == Vector(0, 1));

}

支持重载的操作符 :

15. 类、接口、继承

Dart 中没有接口,类都可以作为接口,把某个类当做接口实现时,只需要使用 implements ,然后复写父类方法即可。

Dart 中支持 mixins ,按照出现顺序应该为extends 、 mixins 、implements 。

Zone

Dart 中可通过 Zone 表示指定代码执行的环境,类似一个沙盒概念,在 Flutter 中 C++ 运行 Dart 也是在 _runMainZoned 内执行 runZoned 方法启动,而我们也可以通过 Zone ,在运行环境内捕获全局异常等信息:

runZoned(() {

runApp(FlutterReduxApp());

}, onError: (Object obj, StackTrace stack) {

print(obj);

print(stack);

});

同时你可以给 runZoned 注册方法,在需要时执行回调,如下代码所示,这样的在一个 Zone 内任何地方,只要能获取 onData 这个 ZoneUnaryCallback,就都可以调用到 handleData

///最终需要处理的地方

handleData(result) {

print(“VVVVVVVVVVVVVVVVVVVVVVVVVVV”);

print(result);

}

///返回得到一个 ZoneUnaryCallback

var onData = Zone.current.registerUnaryCallback<dynamic, int>(handleData);

///执行 ZoneUnaryCallback 返回数据

Zone.current.runUnary(onData, 2);

异步逻辑可以通过 scheduleMicrotask 可以插入异步执行方法:

Zone.current.scheduleMicrotask((){

//todo something

});

更多可参看 :

《Flutter完整开发实战详解(十一、全面深入理解Stream)》

https://juejin.im/post/5cc2acf86fb9a0321f042041

Future

Future 简单了说就是对 Zone 的封装使用。

比如 Future.microtask 中主要是执行了 Zone 的 scheduleMicrotask ,而 result._complete 最后调用的是 _zone.runUnary 等等。

factory Future.microtask(FutureOr computation()) {

_Future result = new _Future();

scheduleMicrotask(() {

try {

result._complete(computation());

} catch (e, s) {

_completeWithErrorCallback(result, e, s);

}

});

return result;

}

Dart 中可通过 async/await 或者 Future 定义异步操作,而事实上 async/await 也只是语法糖,最终还是通过编译器转为 Future。

有兴趣看这里 :

generators

code_generator.dart

Flutter完整开发实战详解(十一、全面深入理解Stream)

Stream

Stream 也是有对Zone 的另外一种封装使用。

Dart 中另外一种异步操作, async / yield 或者 Stream 可定义 Stream 异步, async / yield 也只是语法糖,最终还是通过编译器转为 Stream。**

Stream 还支持同步操作。

1)、Stream 中主要有 Stream 、 StreamController 、StreamSink 和 StreamSubscription 四个关键对象,大致可以总结为:

StreamController :如类名描述,用于整个 Stream 过程的控制,提供各类接口用于创建各种事件流。

StreamSink :一般作为事件的入口,提供如 add , addStream 等。

Stream :事件源本身,一般可用于监听事件或者对事件进行转换,如 listen 、where 。

StreamSubscription :事件订阅后的对象,表面上用于管理订阅过等各类操作,如 cacenl 、pause ,同时在内部也是事件的中转关键。

**2)、一般通过 StreamController 创建 Stream;****通过 StreamSink 添加事件;**通过 Stream 监听事件;通过 StreamSubscription 管理订阅。

3)、Stream 中支持各种变化,比如map 、expand 、where 、take 等操作,同时支持转换为 Future 。

更多可参看 :

《Flutter完整开发实战详解(十一、全面深入理解Stream)》

https://juejin.im/post/5cc2acf86fb9a0321f042041

Flutter 部分

Flutter 和 React Native 不同主要在于 **Flutter UI是直接通过 skia 渲染的 ,而 React Native 是将 js 中的控件转化为原生控件,通过原生去渲染的 ** ,相关更多可查看:

《移动端跨平台开发的深度解析》

https://juejin.im/post/5b395eb96fb9a00e556123ef

Flutter 中存在 Widget 、 Element 、RenderObject 、Layer 四棵树,其中**Widget 与 Element 是多对一的关系 **

Element 中持有Widget 和 RenderObject , 而 Element 与 RenderObject 是一一对应的关系 ,

当 RenderObject 的 isRepaintBoundary 为 true 时,那么个区域形成一个 Layer,所以不是每个 RenderObject 都具有 Layer 的,因为这受 isRepaintBoundary 的影响。

更多相关可查阅

《Flutter完整开发实战详解(九、 深入绘制原理)》

https://juejin.im/post/5ca0e0aff265da309728659a

Flutter 中 Widget 不可变,每次保持在一帧,如果发生改变是通过 State 实现跨帧状态保存,而真实完成布局和绘制数组的是 RenderObject , Element 充当两者的桥梁,** State 就是保存在 Element 中。**

Flutter 中的 BuildContext 只是接口,而 Element 实现了它。

Flutter 中 setState 其实是调用了 markNeedsBuild ,该方法内部标记此Element 为 Dirty ,然后在下一帧 WidgetsBinding.drawFrame 才会被绘制,这可以看出 setState 并不是立即生效的。

Flutter 中 RenderObject 在 attch/layout 之后会通过 markNeedsPaint(); 使得页面重绘,流程大概如下:

通过isRepaintBoundary 往上确定了更新区域,通过 requestVisualUpdate 方法触发更新往下绘制。

正常情况 RenderObject 的布局相关方法调用顺序是 :layout -> performResize -> performLayout -> markNeedsPaint , 但是用户一般不会直接调用 layout,而是通过 markNeedsLayout ,具体流程如下:

Flutter 中一般 json 数据从 String 转为 Object 的过程中都需要先经过 Map 类型。

Flutter 中 InheritedWidget 一般用于状态共享,如Theme 、Localizations 、 MediaQuery 等,都是通过它实现共享状态,这样我们可以通过 context 去获取共享的状态,比如 ThemeData theme = Theme.of(context);

在 Element 的 inheritFromWidgetOfExactType 方法实现里,有一个 Map<Type, InheritedElement> _inheritedWidgets 的对象。

_inheritedWidgets 一般情况下是空的,只有当父控件是 InheritedWidget 或者本身是 InheritedWidgets 时才会有被初始化,而当父控件是 InheritedWidget 时,这个 Map 会被一级一级往下传递与合并 。

所以当我们通过 context 调用 inheritFromWidgetOfExactType 时,就可以往上查找到父控件的 Widget 。

Flutter 中默认主要通过 runtimeType 和 key 判断更新:

static bool canUpdate(Widget oldWidget, Widget newWidget) {

return oldWidget.runtimeType == newWidget.runtimeType

&& oldWidget.key == newWidget.key;

}

}

Flutter 中的生命周期

initState() 表示当前 State 将和一个 BuildContext 产生关联,但是此时BuildContext 没有完全装载完成,如果你需要在该方法中获取 BuildContext ,可以 new Future.delayed(const Duration(seconds: 0, (){//context}); 一下。

didChangeDependencies() 在 initState() 之后调用,当 State 对象的依赖关系发生变化时,该方法被调用,初始化时也会调用。

deactivate() 当 State 被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用。

**dispose() ** Widget 销毁了,在调用这个方法之前,总会先调用 deactivate()。

didUpdateWidge 当 widget 状态发生变化时,会调用。

通过 StreamBuilder 和 FutureBuilder 我们可以快速使用 Stream 和 Future 快速构建我们的异步控件:

《Flutter完整开发实战详解(十一、全面深入理解Stream)》

https://juejin.im/post/5cc2acf86fb9a0321f042041

Flutter 中 runApp 启动入口其实是一个 WidgetsFlutterBinding ,它主要是通过 BindingBase 的子类 GestureBinding 、ServicesBinding 、 SchedulerBinding 、PaintingBinding 、SemanticsBinding 、 RendererBinding 、WidgetsBinding 等,通过 mixins 的组合而成的。

Flutter 中的 Dart 的线程是以事件循环和消息队列的形式存在,包含两个任务队列,一个是 microtask 内部队列,一个是 event 外部队列,而 microtask 的优先级又高于 event 。

因为 microtask 的优先级又高于 event, 同时会阻塞event 队列,所以如果 microtask 太多就可能会对触摸、绘制等外部事件造成阻塞卡顿哦。

Flutter 中存在四大线程,分别为 UI Runner、GPU Runner、IO Runner, Platform Runner **(原生主线程) **,同时在 Flutter 中可以通过 isolate 或者 compute 执行真正的跨线程异步操作。

PlatformView

Flutter 中通过 PlatformView 可以嵌套原生 View 到 Flutter UI 中,这里面其实是使用了 Presentation + VirtualDisplay + Surface 等实现的,大致原理就是:

使用了类似副屏显示的技术,VirtualDisplay 类代表一个虚拟显示器,调用 DisplayManager 的 createVirtualDisplay() 方法,将虚拟显示器的内容渲染在一个 Surface 控件上,然后将 Surface 的 id 通知给 Dart,让 engine 绘制时,在内存中找到对应的 Surface 画面内存数据,然后绘制出来。em… 实时控件截图渲染显示技术。

Flutter 的 Debug 下是 JIT 模式,release下是AOT模式。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的技术,VirtualDisplay 类代表一个虚拟显示器,调用 DisplayManager 的 createVirtualDisplay() 方法,将虚拟显示器的内容渲染在一个 Surface 控件上,然后将 Surface 的 id 通知给 Dart,让 engine 绘制时,在内存中找到对应的 Surface 画面内存数据,然后绘制出来。em… 实时控件截图渲染显示技术。

Flutter 的 Debug 下是 JIT 模式,release下是AOT模式。

[外链图片转存中…(img-mVjDeY87-1713163513866)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-ynVtB4wt-1713163513866)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Flutter 面试可能涉及的技术点: 1. Dart 语言基础:对象、变量、函数、类、接口、泛型等。 2. Flutter 框架基础:Widget、State、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、BuildContext、 3. Flutter 布局:Row、Column、Stack、Expanded、Padding、Center、Align 等。 4. Flutter 手势:GestureDetector、Draggable、LongPressDraggable、DragTarget、GestureDetector 等。 5. Flutter 动画:Animation、Tween、Curve、AnimatedWidget、AnimatedBuilder、Hero 等。 6. Flutter 路由:Navigator、PageRoute、PageRouteBuilder、MaterialApp、CupertinoApp 等。 7. Flutter 状态管理:setState、InheritedWidget、Provider、BLoC、Redux 等。 8. Flutter 网络请求:dio、http、WebSocket 等。 9. Flutter 数据存储:SharedPreferences、sqflite、Hive、Firebase 等。 10. Flutter 插件开发:Flutter 插件开发基础、Flutter-Plugin-Template、Flutter 插件与原生混合开发等。 11. Flutter 优化:内存优化、UI 优化、代码优化等。 以上是 Flutter 面试可能涉及的技术点,面试官可能根据岗位需求和面试者的经验水平来选择相应的题目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值