Mapbox SDK v10を使ったFlutter pluginを作成する。
Mapbox SDK v10を使ったFlutter pluginを作成する。
https://github.com/flutter-mapbox-gl/maps があるが、残念ながら、iOSのSDKがv6.4.xを使用しており、v6.4.xは、April 4, 2023でサポートが終了するため、使用できなかった。
今は、Officialのpluginが出ているので、そちらが使えます!
以下でplugin packageを作成する
flutter create --org <reverse domain> --template=plugin --platform=android,ios -a kotlin -i swift <plugin_name>
libディレクトリに、以下のドキュメントに従って、srcフォルダを追加して、ソースファイルを管理していく。
PlatformViewはこちらを参考に実装をしていく。
現状、AndroidのHybrid compositionは諸刃の刃だな。
Hybrid composition appends the native android.view.View to the view hierarchy. Therefore, keyboard handling, and accessibility work out of the box. Prior to Android 10, this mode might significantly reduce the frame throughput (FPS) of the Flutter UI. See performance for more info.
class NativeViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
val creationParams = args as Map<String?, Any?>?
return NativeView(context, viewId, creationParams)
}
}
上記だと以下のエラーが発生する(Flutter 3を使っているから?)。
Class 'NativeViewFactory' is not abstract and does not implement abstract base class member public abstract fun create(p0: Context?, p1: Int, p2: Any?): PlatformView defined in io.flutter.plugin.platform.PlatformViewFactory
Context
をContext?
に変更するとエラーが解消される。
Mapbox SDK for iOSがv6からv10にバージョンアップしたのがずっと不思議だったのだけれど、androidに合わせるためだったようだ。androidは、v9 -> v10に上がっており、v10からios/androidのバージョンが揃っているよう。
Mapbox SDK for Androidで実際のマップ表示がずれてしまう問題に直面。
試行錯誤した結果、MapInitOption(textureView = true)
にすることで、解決した。
こちらの記事によると、PlatformView自体が、SurfaceViewを使っているらしい。
SurfaceViewについての記事をメモ
- https://source.android.google.cn/devices/graphics/arch-sh?hl=ja
- https://quesera2.hatenablog.jp/entry/2016/08/30/233743
- https://qiita.com/croquette0212/items/24dc2b6de3730e831aab
SurfaceViewは別スレッドで動作するからFlutterでの同期ができていないということも考えられそう。
textureViewを有効にすると以下のエラーログが流れ続けるようだ。(v10.5.0)
E/FrameEvents: updateAcquireFence: Did not find frame.
大丈夫なのか。
TextureView + User locationを表示で、上のエラーが流れ続けるようだ。
マップの描画がずれてしまうのは、Flutter v3からの問題のようだ。
Mapbox SDK for Android v9を使っているflutter-mapbox-gl/mapsでも発生している。
こちらで修正中らしい
むしろv10でTextureViewを使える回避策があったのは良かったのかもしれない。
Flutter 3.3.0で、マップの描画がずれてしまう問題が解消された!