Flutter 面试题

708 阅读6分钟
  1. Flutter里有三棵树,应该是哪三棵树?这种是什么?

    • Flutter中有三棵树: Widget树、Element树和Render树。Widget树由widget组成,描述了UI的结构和外观;Element树是Widget树在渲染过程中的实例,管理着widget的生命周期和状态;Render树是Element树的渲染对象,负责将UI渲染到屏幕上。
  2. Flutter里有几个Key,它们的作用是什么?

    • Flutter里有两个Key,分别是GlobalKey和LocalKey。它们的作用是给组件在组件树中进行标识和定位,以便于在树中查找和操作它们。

    • 局部键(LocalKey):ValueKey、ObjectKey、UniqueKey

    • 全局键(GlobalKey): GlobalKey、GlobalObjectKey

    • ValueKey (值key)

      • 把一个值作为key ,UniqueKey(唯一key)程序生成唯一的Key,当我们不知道如何指定ValueKey的时候就可以使用UniqueKey,ObjectKey(对象key)把一个对象实例作为key。
    • GlobalKey(全局key)

      • GlobalObjectKey(全局Objec key,和ObjectKey有点类似)
    • LocalKey

      • LocalKey只在当前的组件树有效
    • GlobalKey的使用

      • GlobalKey就类似于全局变量
  3. global key他怎么是怎么拿到那个视图的长宽呢?组件的长宽怎么拿到?

    • 使用GlobalKey可以通过currentContext属性获取对应视图的长宽。而对于组件的长宽,可以通过组件的BuildContext对象调用MediaQuery.of(context)方法获取MediaQueryData对象,然后从MediaQueryData对象中获取长宽信息。
  4. InheritedWidget有用过吗?它的作用是什么?

    • 是的,InheritedWidget是Flutter中的一个特殊widget,用于在组件树中共享数据。它的作用是将数据在组件树中向下传递,并在子组件中监听和获取这些数据的变化。
  5. provider有用过吗?GetX有用过吗?

    • 是的,Provider是Flutter中的一个状态管理库,用于实现组件之间的数据共享和状态管理。而GetX是另一个状态管理库,提供了更简洁和高效的方式来管理状态和路由。
  6. GetX里面的lazy put和get.put这俩有什么区别呢?

    • 在GetX中,lazy put是延迟注册依赖项的意思,即只有在需要使用时才注册依赖项。而get.put是立即注册依赖项,即在初始化时就注册依赖项。
  7. 那getxController怎么去监听一个应用前后台的切换。

    • 可以通过GetX中的GetObserver来监听应用前后台的切换。可以通过重写GetObserver中的onResume和onPause方法来处理应用前后台切换的逻辑。
  8. provider这个框架我们想要局部刷新是怎么做的?

    • 在Provider框架中,要实现局部刷新,可以使用Consumer或Selector包裹需要刷新的组件,并在其builder回调中获取需要刷新的数据。当数据发生变化时,只会刷新包裹的组件而不是整个页面。
  9. compute有用过吗?

    • 是的,compute是Flutter中的一个函数,用于在后台线程执行耗时操作。它可以提高应用的性能和响应性,将耗时操作从主线程中分离出来,避免阻塞UI渲染。
  10. 我们在和Flutter和原生做交互的时候,有几种channel和原生交互?

    • 在与Flutter和原生交互时,可以使用MethodChannel、EventChannel和BasicMessageChannel这三种channel进行通信。
  11. 语言的国际化有做过吗?

    • 是的,语言的国际化是指根据用户的语言环境来适配应用的文字、日期、货币等内容。在Flutter中,可以使用flutter_localizations库来实现语言的国际化。
  12. State有了解过吗?

    • 是的,State是Flutter中的一个概念,用于描述组件的可变状态。State对象包含了组件的状态数据,可以在组件的生命周期内进行更新和管理。
  13. 如果底部有一个text field,希望它跟随软键盘一直往上移,该怎么做呢?

    • 可以使用SingleChildScrollView包裹整个页面,并设置resizeToAvoidBottomInset属性为false,这样当键盘弹出时,页面不会被顶上去。
  14. 使用GetX,如果想要从C页面直接转换到A页面,并销毁B页面,该怎么做?

    • 可以使用GetX中的Get.offAndToNamed方法实现从C页面直接跳转到A页面,并销毁B页面。
  15. 动画有做过吗?

    • 是的,使用Flutter可以实现各种动画效果。Flutter提供了丰富的动画API,可以使用Animation、Tween和AnimatedWidget等类来创建和控制各种类型的动画效果。
  16. 屏幕适配有做过吗?

    • 是的,屏幕适配是指将应用的UI界面在不同尺寸和比例的屏幕上进行适配。Flutter提供了多种方式来进行屏幕适配,如使用MediaQuery、LayoutBuilder和FractionallySizedBox等组件。
  17. Sliver系列的组件用过吗?

    • 是的,Sliver系列的组件是Flutter中用于构建可滚动视图的特殊组件。例如SliverAppBar、SliverList和SliverGrid等,它们可以实现复杂的滚动效果和布局。
  18. 普通的ListView组件和Sliver系列的组件有什么区别?

    • 普通的ListView组件是一个整体,将所有子项一次性构建和渲染。而Sliver系列的组件可以根据可视区域的大小动态构建和渲染子项,提高了性能和内存效率。
  19. StatelessWidget和StatefulWidget的区别是什么?

    • StatelessWidget是无状态的widget,其属性一旦确定就不会再发生变化。而StatefulWidget是有状态的widget,其属性可以在组件的生命周期内发生变化。
  20. 使用GetX,如果我想改变一个组件的颜色,应该怎么做?

    • 可以使用GetX中的Obx或GetX组件,将需要改变颜色的组件包裹起来,并在其builder回调中根据状态值来动态改变颜色。
  21. 如果有一个PageView,我不想在左右滑动时走上生命周期,想要保持当前状态,应该怎么做?

    • 可以使用PageStorageKey来保持PageView的状态。通过设置PageStorageKey的值,在切换页面时保持原有的状态。
  22. FutureBuilder和StreamBuilder有用过吗?有什么区别?

    • 是的,FutureBuilder和StreamBuilder都是用于处理异步数据的组件。FutureBuilder用于处理Future类型的异步操作,而StreamBuilder用于处理Stream类型的异步操作。
  23. 你有没有在直播间中播放SVG礼物?

    • 可以使用Flutter中的动画库和flutter_svg库来实现在直播间中播放SVG礼物。
  24. Socket是用来做什么的?Flutter中Socket是使用WebSocket吗?

    • Socket是一种网络通信协议,用于在网络中进行数据传输。而Flutter中的Socket并非使用WebSocket协议,而是基于dart:io库的Socket类实现网络通信。
  25. 你有做过Flutter的优化吗?

    • 是的,优化Flutter应用可以从多个方面入手,比如减少不必要的渲染、优化布局和绘制、减少内存占用和网络请求等。可以使用性能分析工具和优化技巧来提高应用的性能和响应速度。
  26. 你有对列表进行优化吗?比如加载大量图片的情况。

    • 是的,对于加载大量图片的情况,可以使用Flutter的缓存技术来提高性能。比如使用cached_network_image库来缓存网络图片,或使用flutter_cache_manager库来管理图片缓存。此外,可以使用ListView的builder构造函数来动态构建列表项,避免一次性加载大量图片。