Flutter面试题——面试题1

一 面试题知识点

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

二 面试题解答

2.1 Flutter种Widget视图的生命周期

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

StatelessWidget(无状态)

生命周期只有 build

StatefulWidget (有状态)

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

名称描述调用次数
createStatecreateState 是 StatefulWidget 里创建 State 的方法,当要创建新的 StatefulWidget 的时候,会立即执行 createState,而且只执行一次1次
initStateinitState 是 StatefulWidget 创建完后调用的第一个方法,而且只执行一次,类似于 Android 的 onCreate、iOS 的 viewDidLoad(),所以在这里 View 并没有渲染,但是这时 StatefulWidget 已经被加载到渲染树里了,这时 StatefulWidget 的 mount的值会变为 true,直到 dispose调用的时候才会变为 false。可以在 initState里做一些初始化的操作。1次
didChangeDependencies1、当 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;

  @override
  void 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);
    });
  }

  @override
  bool shouldRepaint(DrawingBoardPainter oldDelegate) {
    return true;
  }
}

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

结合2.5说明

2.7 Flutter中使用Opengl

pub.dev中opengle类库

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您介绍一些常见的Flutter面试题。以下是一些常见的Flutter面试题及其答案: 1. Flutter是什么?它有哪些特点? Flutter是一个跨平台的移动应用开发框架,由Google开发。它具有以下特点: - 快速开发:使用热重载功能可以快速进行开发和调试。 - 跨平台:可以在iOS和Android等多个平台上运行。 - 漂亮的UI:Flutter提供了丰富的UI组件,可以创建漂亮的用户界面。 - 高性能:Flutter使用自绘引擎,可以实现高性能的应用程序。 2. Flutter中的Widget是什么? 在Flutter中,一切都是Widget。Widget是Flutter应用程序的基本构建块,用于构建用户界面。Widget可以是一个简单的按钮或文本,也可以是一个复杂的布局。 3. 什么是StatefulWidget和StatelessWidget? StatefulWidget和StatelessWidget是Flutter中两种常见的Widget类型。 - StatefulWidget:具有可变状态的Widget,可以根据状态的变化重新构建UI。 - StatelessWidget:没有可变状态的Widget,一旦构建完成就不会再改变。 4. 什么是热重载(Hot Reload)? 热重载是Flutter的一个强大功能,它允许开发者在不重新启动应用程序的情况下快速查看代码更改后的效果。通过热重载,开发者可以实时地看到UI的变化,加快开发速度。 5. Flutter中的路由是什么? 在Flutter中,路由用于管理页面之间的导航。每个页面都有一个唯一的路由名称,可以通过路由名称来打开或关闭页面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值