Open13

Mapbox SDK v10を使ったFlutter pluginを作成する。

sceneescenee

PlatformViewはこちらを参考に実装をしていく。
https://docs.flutter.dev/development/platform-integration/platform-views#hybrid-composition

現状、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.

sceneescenee
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

ContextContext?に変更するとエラーが解消される。

sceneescenee

Mapbox SDK for iOSがv6からv10にバージョンアップしたのがずっと不思議だったのだけれど、androidに合わせるためだったようだ。androidは、v9 -> v10に上がっており、v10からios/androidのバージョンが揃っているよう。

sceneescenee

Mapbox SDK for Androidで実際のマップ表示がずれてしまう問題に直面。
1e9977de6201-20220527.png

試行錯誤した結果、MapInitOption(textureView = true)にすることで、解決した。

sceneescenee

こちらの記事によると、PlatformView自体が、SurfaceViewを使っているらしい。
https://itome.team/blog/2019/12/flutter-advent-calendar-day13/

SurfaceViewについての記事をメモ

SurfaceViewは別スレッドで動作するからFlutterでの同期ができていないということも考えられそう。

sceneescenee

textureViewを有効にすると以下のエラーログが流れ続けるようだ。(v10.5.0)

E/FrameEvents: updateAcquireFence: Did not find frame.

大丈夫なのか。

sceneescenee

TextureView + User locationを表示で、上のエラーが流れ続けるようだ。

sceneescenee

Flutter 3.3.0で、マップの描画がずれてしまう問題が解消された!