一 面试题知识点

  • Flutter种Widget视图的生命周期
  • Flutter中的三棵树
  • Flutter动画
  • Flutter中手势操作
  • Flutter绘制(签名/画笔)
  • 有无做过手绘相关的项目
  • Flutter中使用Opengl

二 面试题解答

2.1 Flutter种Widget视图的生命周期

flutter中widget主要分为 StatelessWidget 和 StatefulWidget 两种 二者生命周期不太一样

StatelessWidget(无状态)

生命周期只有 build

StatefulWidget (有状态)

需要持有状态 State,这里面包含了一系列生命周期方法

名称 描述 调用次数
createState createState 是 StatefulWidget 里创建 State 的方法,当要创建新的 StatefulWidget 的时候,会立即执行 createState,而且只执行一次 1次
initState initState 是 StatefulWidget 创建完后调用的第一个方法,而且只执行一次,类似于 Android 的 onCreate、iOS 的 viewDidLoad(),所以在这里 View 并没有渲染,但是这时 StatefulWidget 已经被加载到渲染树里了,这时 StatefulWidget 的 mount的值会变为 true,直到 dispose调用的时候才会变为 false。可以在 initState里做一些初始化的操作。 1次
didChangeDependencies 1、当 StatefulWidget 第一次创建的时候,didChangeDependencies方法会在 initState方法之后立即调用,之后当 StatefulWidget 刷新的时候,就不会调用了,
2、或者你的 StatefulWidget 依赖的 InheritedWidget 发生变化之后,didChangeDependencies才会调用,所以 didChangeDependencies有可能会被调用多次。
1次或多次
build 在 StatefulWidget 第一次创建的时候,build方法会在 didChangeDependencies方法之后立即调用,另外一种会调用 build方法的场景是,每当 UI 需要重新渲染的时候(setState触发),build都会被调用,所以 build会被多次调用,然后 返回要渲染的 Widget。千万不要在 build里做除了创建 Widget 之外的操作,因为这个会影响 UI 的渲染效率 多次
didUpdateWidget 祖先节点rebuild widget时调用,当组件改变状态时就会调用,
需要注意的是,涉及到controller的变更,需要在这个函数中移除老的controller的监听,并创建新controller的监听。
1次或多次
deactivate 要将 State 对象从渲染树中移除的时候,就会调用 deactivate生命周期,这标志着 StatefulWidget 将要销毁,但是有时候 State 不会被销毁,而是重新插入到渲染树种 1次或多次
dispose 当 View 不需要再显示,从渲染树中移除的时候,State 就会永久的从渲染树中移除,就会调用 dispose生命周期,这时候就可以在 dispose里做一些取消监听、动画的操作,和 initState是相反的 1次

2.2 Flutter中的三棵树

Flutter 中存在 WidgetElementRenderObject 三棵树,其中 WidgetElement 是一对多的关系ElementRenderObject 是一一对应的关系

三棵树介绍:

  • Widget是用户界面的一部分,并且是不可变的。
  • Element是在树中特定位置Widget的实例。
  • RenderObject是渲染树中的一个对象,它的层次结构是渲染库的核心。

2.3 Flutter动画

Flutter动画

  • AnimationController动画
  • Tween动画,又叫补间动画
  • Curve动画
  • TweenSequence序列动画
  • 自定义动画
  • Simulation物理动画
  • AnimatedList列表动画
  • 帧动画
  • Gif动画
  • Hero过度动画

第三方动画

  • Lottie
  • Flare
  • Nima
  • Rive

2.4 Flutter中手势操作

Flutter中手势识别组件

  • GestureDetector
  • Ink/InkWell
  • Listener

2.5 Flutter绘制(签名/画笔)

绘制API

/// 画布状态相关void save() native 'Canvas_save';
void saveLayer(Rect? bounds, Paint paint)
void restore() native 'Canvas_restore';
int getSaveCount() native 'Canvas_getSaveCount';/// 画布变换相关
void translate(double dx, double dy) native 'Canvas_translate';
void scale(double sx, [double? sy]) => _scale(sx, sy ?? sx);
void rotate(double radians) native 'Canvas_rotate';
void skew(double sx, double sy) native 'Canvas_skew';
void transform(Float64List matrix4)/// 画布裁剪相关
void clipRect(Rect rect, { ClipOp clipOp = ClipOp.intersect, bool doAntiAlias = true })
void clipRRect(RRect rrect, {bool doAntiAlias = true})
void clipPath(Path path, {bool doAntiAlias = true})/// 线
void drawLine(Offset p1, Offset p2, Paint paint)///矩形
void drawRect(Rect rect, Paint paint)
void drawRRect(RRect rrect, Paint paint)
void drawDRRect(RRect outer, RRect inner, Paint paint)///圆相关
void drawOval(Rect rect, Paint paint)
void drawCircle(Offset c, double radius, Paint paint)
void drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint)///图片
void drawImage(Image image, Offset offset, Paint paint)
void drawImageRect(Image image, Rect src, Rect dst, Paint paint)
void drawImageNine(Image image, Rect center, Rect dst, Paint paint)
void drawPicture(Picture picture)
void drawAtlas(Image atlas,List<RSTransform> transforms,List<Rect> rects,List<Color>? colors,BlendMode? blendMode,Rect? cullRect,Paint paint)void drawRawAtlas(Image atlas,Float32List rstTransforms,Float32List rects,Int32List? colors,BlendMode? blendMode,Rect? cullRect,Paint paint) ///文字
void drawParagraph(Paragraph paragraph, Offset offset) ///点
void drawPoints(PointMode pointMode, List<Offset> points, Paint paint)
void drawRawPoints(PointMode pointMode, Float32List points, Paint paint)
void drawVertices(Vertices vertices, BlendMode blendMode, Paint paint)/// 其他
void drawColor(Color color, BlendMode blendMode)
void drawPaint(Paint paint)
void drawPath(Path path, Paint paint)
void drawShadow(Path path, Color color, double elevation, bool transparentOccluder)

绘制示例-画板

class DrawingBoardPainter extends CustomPainter {final List<List<Offset>> path;DrawingBoardPainter(this.path);Paint _paint = Paint()..color = Colors.red..style = PaintingStyle.stroke..strokeWidth = 3;@overridevoid paint(Canvas canvas, Size size) {path.forEach((list) {Path _path = Path();for (int i = 0; i < list.length; i++) {if (i == 0) {_path.moveTo(list[i].dx, list[i].dy);} else {_path.lineTo(list[i].dx, list[i].dy);}}canvas.drawPath( _path, _paint);});}@overridebool shouldRepaint(DrawingBoardPainter oldDelegate) {return true;}
}

2.6 有无做过手绘相关的项目

结合2.5说明

2.7 Flutter中使用Opengl

pub.dev中opengle类库

  • opengl
  • flutter_gl

Flutter面试题——面试题1相关推荐

  1. 前端笔试题面试题记录(上)

    前言 过完元宵,就到上海找了波工作,现在已经入职好了,蹭波热点,写一波面试记录,内容包含笔试题和面试题,还有一些没有写进来,准备再开一篇,许久没写了,写的确实有些慢.如果喜欢的话可以点波赞,或者关注一 ...

  2. sql 以a开头的所有记录_#9#猴子聊数据分析之常见的SQL笔试题和面试题(下)

    题目来源 猴子:常见的SQL笔试题和面试题(下)​zhuanlan.zhihu.com 1.SQL语言允许使用通配符进行字符串匹配的操作,其中'%'可以表示:多个字符 2.通过 SQL,如何从 &qu ...

  3. 大唐电信JAVA笔试题面试题

    为什么80%的码农都做不了架构师?>>>    大唐电信JAVA笔试题面试题 1.    描述一下public,protected,private,final关键字在Java中的用法 ...

  4. 试题 历届试题 包子凑数(dp)

    试题 历届试题 包子凑数 资源限制 时间限制:1.0s 内存限制:256.0MB 0x00 问题描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包 ...

  5. 试题 历届试题 幸运数(二分)

    试题 历届试题 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然 ...

  6. 试题 历届试题 翻硬币(贪心)

    试题 历届试题 翻硬币 资源限制 时间限制:1.0s 内存限制:256.0MB Work hard,Play harder. 问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排 ...

  7. 试题 历届试题 买不到的数目(dp/数学)

    试题 历届试题 买不到的数目 资源限制 时间限制:1.0s 内存限制:256.0MB $Daily English 曾几何时,我流连梦境,心比天高,人生充满希望. I dreamed a dream ...

  8. 试题 历届试题 带分数(全排列)

    试题 历届试题 带分数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 ...

  9. 前端笔试题面试题记录(下)

    前言 接上篇前端笔试题面试题记录(上).趁清明小长假,把上篇剩下的部分也写一下,因为最近比较忙这篇已经拖了很久了.现在刚刚开始银四了,应该还是有些小伙伴在找工作,时间还不算太晚,希望本篇可以帮到这些小 ...

  10. 常见的SQL笔试题和面试题:SQL经典50题

    常见的SQL笔试题和面试题(上):经典50题 已知有如下4张表: 学生表:STUDENT(S#,SNAME,SAGE,SSEX) 课程表:COURSE(C#,CNAME,T#) 成绩表:SC(S#,C ...

最新文章

  1. pycharm安装tensorflow
  2. Android中关于APK文件的下载、安装和卸载
  3. Java技巧-解决JAVA_HOME变量无效问题
  4. 关于node-sass和sass-loader安装上去的时候的时候报错的问题
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】
  6. java怎么知道上传文件是否成功_文件包含漏洞之——tomcat CVE-2020-1938漏洞复现
  7. A Simple Math Problem 矩阵打水题
  8. usr/sbin/inetd
  9. 新华三模拟器STP和RSTP及其MSTP的作用与配置
  10. python+opencv+百度智能云 人脸识别——人脸相似度对比
  11. 教学演示软件 模型十二 地理学的水循环模型
  12. 【人因工程】认知行为可靠性评价浅谈
  13. 百度网盘制作百度分享链接
  14. 层次、网状、关系模型
  15. VC浏览器相关的学习(四)(在BHO中获取IE版本以及获取窗体句柄)
  16. 【Effective C++】总结
  17. Java程序验证五子棋先手必胜,五子棋怎样下最厉害_五子棋先手必胜开局图
  18. 单因素方差分析(ANOVA)及其Python库
  19. wms系统对仓库进行集中管理
  20. SQLserver 连接服务器样例

热门文章

  1. 编织一个电影世界 --《流浪地球2》的科学顾问造梦手记开篇
  2. Linux跨服务器监控文件,[转]Linux下用inotify-tool实时监控服务器文件系统
  3. bzoj 1176 Mokia (cdq分治)
  4. android 剪切板工具类
  5. 通证经济大局观(二十三):部落与技术进步
  6. 1.7-22:紧急措施
  7. JsRender模板定义和数据绑定
  8. 谷歌浏览器怎么清除浏览器缓存以及本地缓存localstorage。
  9. journal日志文件清理与优化
  10. [转] 魔兽系列事件报道