完全な制御:2019ポイントには、最新の知識フラッタのインタビューをまとめたもの

序文

最近、私はインタビューに関連しており、今いくつかは、フラッターの募集要件を列挙し始めている、そう思ったが、それの要約を書くために、フラッター学習と考えることができた、その多くフラッター関連の問題を、相談人々がたくさんありますレビュー。

完全な学習システムは、あなたがより多くのフラッターはまた、公式サイトを参照してください知識ポイントのいくつかをまとめることができますここで必要不可欠です。小さなパートナーのように歓迎の注意任意の良い記事にも貢献することを歓迎している場合、私は定期的に知識やAndroidの決意を共有しますが、また、BATJインタビューのトピックは常に更新、交換を議論するために来て歓迎します。

フラッター一部

基本

UIのレンダリングskiaを通じて主に直接ネイティブ異なるとフラッターフラッターを反応するが、jsはネイティブが、主制御コントロールに変換されてネイティブをレンダリングするように反応します。

  • フラッターが存在し  Widget 、  Element 、RenderObject 、Layer4本の木、  関係は多くの1つですWidgetElement

  • Element 保留にWidget して  RenderObjectいる間の関係は1:1でありますElementRenderObject

  • 場合  ある 時間、次いで形成領域  そうではないすべてが  持っている この主題があるため、  影響を受けました。RenderObjectisRepaintBoundarytrueLayerRenderObjectLayerisRepaintBoundary

  • フラッタがで  Widget 不変、各々が場合、に保持変化を介して起こることがある  State 保存のクロスフレームの状態が、実際の描画が完了すると、アレイのレイアウトは  RenderObject 、 Element  両者の間のブリッジとして機能するように、  State それに格納されています  Element 。

  • フラッターがある  BuildContext だけでインターフェースが、  Element それを達成するために。

  • フラッターはで  setState 実際に、呼び出された markNeedsBuild  メソッドの内部マークこのElement ように Dirty  して、次のフレームで  WidgetsBinding.drawFrame 見られるように、描画されます  setStateすぐには反映されませ。

  • 中フラッター  /  後に通過します   、次のように再描画されているページを作り、プロセスは、おそらく次のとおりです。RenderObjectattchlayoutmarkNeedsPaint();

WEBP

isRepaintBoundary方法をドローダウンrequestVisualUpdateによってトリガ更新領域を、更新決定まで。

  • 通常、  RenderObject レイアウト関連メソッド呼び出しのシーケンスは次のとおりです。  layout - >  performResize - >  performLayout - >  markNeedsPaint 、  しかし、一般的にユーザーを呼び出すことはありません  layout、しかしによって markNeedsLayout  特定のプロセスは次のとおりです。

WEBP

  • フラッター一般的な  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 状态发生变化时,会调用。

WEBP


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

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

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

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

  • Flutter 中存在四大线程,分别为 UI RunnerGPU RunnerIO 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模式。

  • Flutter 中可以通过 mixins AutomaticKeepAliveClientMixin ,然后重写 wantKeepAlive保持住页面,记得在被保持住的页面 build 中调用 super.build 。(因为 mixins 特性)。

  • Flutter 手势事件主要是通过竞技判断的:

主要有 hitTest 把所有需要处理的控件对应的 RenderObject , 从 child 到 parent 全部组合成列表,从最里面一直添加到最外层。

然后从队列头的 child 开始 for 循环执行 handleEvent 方法,执行 handleEvent 的过程不会被拦截打断。

一般情况下 Down 事件不会决出胜利者,大部分时候是在 MOVE 或者 UP 的时候才会决出胜利者。

竞技场关闭时只有一个的就直接胜出响应,没有胜利者就拿排在队列第一个强制胜利响应。

同时还有 didExceedDeadline 处理按住时的 Down 事件额外处理,同时手势处理一般在 GestureRecognizer 的子类进行。

  • Flutter 中 ListView 滑动其实都是通过改变 ViewPort 中的 child 布局来实现显示的。

  • 常用状态管理的:目前有 scope_model 、flutter_redux 、fish_redux 、bloc + Stream 等几种模式。

Platform Channel

Flutter 中可以通过 Platform Channel 让 Dart 代码和原生代码通信的:

  • BasicMessageChannel :用于传递字符串和半结构化的信息。

  • MethodChannel :用于传递方法调用(method invocation)。

  • EventChanne l: 用于数据流(event streams)的通信。

同时 Platform Channel 并非是线程安全的 。
其中基础数据类型映射如下:

WEBP


Android 启动页

Android 中 Flutter 默认启动时会在 FlutterActivityDelegate.java 中读取 AndroidManifset.xml 内 meta-data 标签,其中 io.flutter.app.android.SplashScreenUntilFirstFrame 标志位如果为 ture ,就会启动 Splash 画面效果(类似IOS的启动页面)。

ネイティブコードがブート読み取ると  android.R.attr.windowBackground 、指定取得し  Drawable 、表示開始-スプラッシュ画面効果のために、次にによって  flutterView.addFirstFrameListeneronFirstFrameスプラッシュスクリーンの除去。

記事は、小さな小さなZangaを助けるために良いパートナーを感じるああ注意、何か質問がありますまた、為替を議論するために来て歓迎しています。

おすすめ

転載: blog.51cto.com/13673213/2421860