序文
最近、私はインタビューに関連しており、今いくつかは、フラッターの募集要件を列挙し始めている、そう思ったが、それの要約を書くために、フラッター学習と考えることができた、その多くフラッター関連の問題を、相談人々がたくさんありますレビュー。
完全な学習システムは、あなたがより多くのフラッターはまた、公式サイトを参照してください知識ポイントのいくつかをまとめることができますここで必要不可欠です。小さなパートナーのように歓迎の注意任意の良い記事にも貢献することを歓迎している場合、私は定期的に知識やAndroidの決意を共有しますが、また、BATJインタビューのトピックは常に更新、交換を議論するために来て歓迎します。
フラッター一部
基本
UIのレンダリングskiaを通じて主に直接ネイティブ異なるとフラッターフラッターを反応するが、jsはネイティブが、主制御コントロールに変換されてネイティブをレンダリングするように反応します。
フラッターが存在し
Widget
、Element
、RenderObject
、Layer
4本の木、 関係は多くの1つですWidget
Element
Element
保留にWidget
してRenderObject
いる間の関係は1:1でありますElement
RenderObject
場合 ある 時間、次いで形成領域 そうではないすべてが 持っている この主題があるため、 影響を受けました。
RenderObject
isRepaintBoundary
true
Layer
RenderObject
Layer
isRepaintBoundary
フラッタがで
Widget
不変、各々が場合、に保持変化を介して起こることがあるState
保存のクロスフレームの状態が、実際の描画が完了すると、アレイのレイアウトはRenderObject
、Element
両者の間のブリッジとして機能するように、State
それに格納されていますElement
。フラッターがある
BuildContext
だけでインターフェースが、Element
それを達成するために。フラッターはで
setState
実際に、呼び出されたmarkNeedsBuild
メソッドの内部マークこのElement
ようにDirty
して、次のフレームでWidgetsBinding.drawFrame
見られるように、描画されますsetState
すぐには反映されませ。中フラッター / 後に通過します 、次のように再描画されているページを作り、プロセスは、おそらく次のとおりです。
RenderObject
attch
layout
markNeedsPaint();
isRepaintBoundary方法をドローダウンrequestVisualUpdateによってトリガ更新領域を、更新決定まで。
通常、
RenderObject
レイアウト関連メソッド呼び出しのシーケンスは次のとおりです。layout
- >performResize
- >performLayout
- >markNeedsPaint
、 しかし、一般的にユーザーを呼び出すことはありませんlayout
、しかしによってmarkNeedsLayout
特定のプロセスは次のとおりです。
フラッター一般的な 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
状态发生变化时,会调用。
通过
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 Runner
、GPU Runner
、IO 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
并非是线程安全的 。
其中基础数据类型映射如下:
Android 启动页
Android 中 Flutter
默认启动时会在 FlutterActivityDelegate.java
中读取 AndroidManifset.xml 内 meta-data
标签,其中 io.flutter.app.android.SplashScreenUntilFirstFrame
标志位如果为 ture ,就会启动 Splash 画面效果(类似IOS的启动页面)。
ネイティブコードがブート読み取ると android.R.attr.windowBackground
、指定取得し Drawable
、表示開始-スプラッシュ画面効果のために、次にによって flutterView.addFirstFrameListener
、onFirstFrame
スプラッシュスクリーンの除去。
記事は、小さな小さなZangaを助けるために良いパートナーを感じるああ注意、何か質問がありますまた、為替を議論するために来て歓迎しています。