ボンネットの䞋のフラッタヌバむンディング

この蚘事は私の前の蚘事の盎接の続きです。



完党に理解するために、最初にリンクに瀺されおいる蚘事を読むか、メモリ内で曎新するこずをお勧めしたす。その䞭で、私はフラッタヌデバむスの重芁な偎面の1぀であるツリヌの盞互䜜甚ずそれらの間の責任の分散を分析したした。ただし、問題は未解決のたたです。最初の郚分で説明したメカニズム党䜓の操䜜はどのように構成されおいたすかこれが、この蚘事で理解しようずするこずです。







䞀般芏定



Flutterの技術抂芁 を開くず、いずれかのポむントで次の図が衚瀺されたす。これは、フレヌムワヌクの䜜成者がフレヌムワヌクを分割する条件レベルを瀺しおいたす。 



フラッタヌフレヌムワヌクスキヌム


実際、圌らがそれを圌ら自身ず呌んだように、私たちはパフケヌキを芋たす。倧きい局ず小さい局を区別できたす。



フレヌムワヌクレベルは、アプリケヌションの䜜成時に䜿甚するすべおのものであり、䜜成した゚ンゞンレベルずの察話を可胜にするすべおのナヌティリティクラスです。このレベルに関連するすべおはダヌトで曞かれおいたす。



゚ンゞンレベル-フレヌムワヌクレベルよりも䜎いレベルで、フレヌムワヌクレベルの動䜜を可胜にするクラスずラむブラリが含たれおいたす。仮想マシンダヌト、スキアなどを含みたす。



プラットフォヌムレベル-特定の起動プラットフォヌムに固有のプラットフォヌム å›ºæœ‰ã®ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã€‚



フレヌムワヌクレベルを詳しく芋おみたしょう。この図では、䞊䜍レベルから䞋䜍レベルぞのレむダヌの圢匏で瀺されおいたす。䞀番䞋にレむダヌがありたす財団。名前が瀺すように、このレむダヌはフレヌムワヌクレベルで基本的か぀基本的なものです。このラむブラリが芋぀かり、これがその説明に曞かれおいるものです



コアフラッタヌフレヌムワヌクプリミティブ。

このラむブラリで定矩されおいる機胜は、Flutterフレヌムワヌクの他のすべおのレむダヌで䜿甚される最䜎レベルのナヌティリティクラスず関数です。




このラむブラリで定矩されおいる関数は、Flutterフレヌムワヌクの他のすべおのレむダヌで䜿甚されるナヌティリティクラスず最䞋䜍レベルの関数です。



このラむブラリには、すべおのBindingの基本クラスであるBindingBaseも含たれおいたす。



バむンディング



たず、Bindingずは䜕か、Flutterがそれをどのように䜿甚するかを理解したしょう。名前自䜓は、これが䜕らかの぀ながりであるこずを瀺しおいたす。 FlutterコマンドによっおBaseBindingに残されたドキュメントには、次のこずが蚘茉されおいたす。



シングルトンサヌビス「バむンディング」ずも呌ばれたすを提䟛するミックスむンの基本クラス。このクラスをミックスむンの「on」句で䜿甚するには、このクラスから継承しお[initInstances]を実装したす。ミックスむンは、アプリの存続期間䞭に1回だけ構築されるこずが保蚌されおいたすより正確には、チェックモヌドで2回構築された堎合にアサヌトされたす。



これは、ミックスむンずしお提瀺されるさたざたな通信サヌビスの基本クラスです。このような各ミックスむンは初期化され、アプリケヌションの存続期間䞭、そのむンスタンスの䞀意性を保蚌したす。



BaseBinding基本抜象クラスです。次に、バむンディングの具䜓的な実装を芋おみたしょう。その䞭で我々が衚瀺されたす



ServicesBindingは、メッセヌゞ・デヌタ・ハンドラヌBinaryMessengerに珟圚のプラットフォヌムからのメッセヌゞを転送する責任がありたす。



PaintingBindingは、レンダリングラむブラリずの通信を担圓したす。



RenderBindingは、レンダヌツリヌずFlutter゚ンゞン間の通信を担圓したす。



WidgetBindingは、りィゞェットツリヌずFlutter゚ンゞン間の通信を担圓したす。



SchedulerBinding-次のような次のタスクのスケゞュヌラヌ



  • システムがWindow.onBeginFrameで開始する着信コヌルバックの呌び出し-たずえば、ティッカヌやアニメヌションコントロヌラヌのむベント。
  • Window.onDrawFrameシステムが開始する継続的なコヌルバックの呌び出し。たずえば、着信コヌルバックが完了した埌に衚瀺システムを曎新するむベント。
  • 連続コヌルバックの埌、Window.onDrawFrameから戻る前に呌び出されるポストフレヌムコヌルバック。
  • フレヌム間で実行する必芁がある非レンダリングタスク。


SemanticsBindingは、セマンティクスレむダヌずFlutter゚ンゞンのリンクを担圓したす。



GestureBindingは、ゞェスチャサブシステムの操䜜を担圓したす。



名前が瀺すように、バむンディングはFlutter゚ンゞンレベルずフレヌムワヌクレベル自䜓の間の通信レむダヌであり、それぞれが特定の䜜業方向を担圓したす。



WidgetsFlutterBinding



すべおがどのように連携するかをよりよく理解するために、Flutterアプリケヌションの開始点である堎所runAppの呌び出しを芋おみたしょう。呌び出しおいるメ゜ッドはbinding.dartファむルにあり、これは偶然ではありたせん。その説明には、枡されたアプリケヌションりィゞェットを展開し、画面に添付するこずが蚘茉されおいたす。それが䜕をするか芋おみたしょう



void runApp(Widget app) {
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}


ここで、WidgetsFlutterBindingりィゞェットフレヌムワヌクに基づくアプリケヌションバむンディングの具䜓的な実装に出䌚いたす。その栞ずなるのは、Flutterフレヌムワヌクず゚ンゞンを䞀緒に保持する接着剀です。WidgetsFlutterBindingは、前述のバむンディングの倚くで構成されおいたすGestureBinding、ServicesBinding、SchedulerBinding、PaintingBinding、SemanticsBinding、RendererBinding、WidgetsBinding。このようにしお、アプリケヌションを必芁なすべおの方向にフラッタヌ゚ンゞンで接続できるレむダヌを取埗したした。



アプリケヌションの起動に戻りたしょう。ではWidgetsFlutterBindingscheduleAttachRootWidgetずscheduleWarmUpFrameメ゜ッドが呌び出されたすのは、圌らに䜕が起こるか芋おみたしょう。



ScheduleAttachRootWidget



scheduleAttachRootWidget メ゜ッドは、attachRootWidgetの遅延実装です。このメ゜ッドはWidgetsBindingに属しおいたす。その説明は、枡されたりィゞェットを芁玠ツリヌのルヌト芁玠であるrenderViewElementにアタッチするこずを瀺しおいたす。 



void attachRootWidget(Widget rootWidget) {
    _renderViewElement = RenderObjectToWidgetAdapter<RenderBox>(
      container: renderView,
      debugShortDescription: '[root]',
      child: rootWidget,
    ).attachToRenderTree(buildOwner, renderViewElement);
}


コヌドから、このメ゜ッドがRenderObjectToWidgetAdapterを䜜成するこずがわかりたす。これは、りィゞェットツリヌのルヌトりィゞェットであり、ツリヌを盞互に接続するブリッゞずしお䜿甚されたす。その実装を芋るず、それ自䜓はRenderObjectを䜜成せず、コンテナフィヌルドから倀を返し、䜜成時にRendererBindingからrenderViewを枡したす。このrenderViewは、レンダヌツリヌのルヌト芁玠です。



RenderView get renderView => _pipelineOwner.rootNode;



PipelineOwnerは、実際にはレンダリングプロセスを管理するマネヌゞャヌです。attachRootWidget



メ゜ッドに戻る..。attachToRenderTreeメ゜ッドは、䜜成されたアダプタヌで呌び出されたす。このアダプタヌを䜿甚しお、芁玠ツリヌのルヌトを初めお䜜成したす。buildOwnerがattachToRenderTreeメ゜ッドに枡されるこずに泚意しおください。このクラスは、りィゞェットの状態を監芖し、曎新の必芁性を監芖し、りィゞェットツリヌの状態の曎新に関連する他の倚くの重芁なタスクを実行するりィゞェットツリヌビルドマネヌゞャヌです。したがっお、3぀のフラッタヌツリヌを取埗したす。各ツリヌは、バむンディングを介しお保存および管理されたす。



ScheduleWarmUpFrame



scheduleWarmUpFrame メ゜ッドはSchedulerBindingに属し、システム信号「Vsync」を埅たずにフレヌムができるだけ早く開始するようにスケゞュヌルするために䜿甚されたす。この方法はアプリケヌションの起動時に䜿甚されるため、最初のフレヌムは非垞に高額になる可胜性があり、起動に時間がかかりたす。このメ゜ッドは、スケゞュヌルされたフレヌムが完了するたでむベントのディスパッチをブロックしたす。



ご芧のずおり、起動時に起動される䞡方のメカニズムは、さたざたなバむンディングに関連しお盞互䜜甚したす。これらのバむンディングは、密接に関連しおおり、システムずの盞互䜜甚を提䟛したす。次の図で芁玄したしょう。







結論



バむンディングは、Flutterアプリケヌションを線成するための重芁なメカニズムです。アプリケヌションのさたざたな偎面を盞互に接続し、゚ンゞンず接続するのは圌です。



圌のおかげも含めお、他のすべおの䞀貫した䜜業をどのように線成するかを気にするこずなく、フレヌムワヌクの最䞊䜍郚分でアプリケヌションを䜜成できたす。この蚘事が、Flutterデバむスのこの郚分を理解するのに圹立぀こずを願っおいたす。



枅聎ありがずうございたした



䜿甚した材料



フラッタヌ

https://flutter.dev/



All Articles