Создайте представление с родной платформы и извлеките его по каналу flutter

#android #ios #flutter #view #flutter-platform-channel

Вопрос:

Я новичок в flutter, но я читал, что в flutter не было простого способа анимировать векторную графику, как это позволял Android.

У меня есть векторный индикатор выполнения, который я хочу анимировать, чтобы добиться прогресса. Затем я попытался использовать канал платформы, чтобы получить собственный код Android / iOS для анимации моего вектора.

На данный момент я тестировал только Android, и это мой код, который не работает из-за представления :

Трепетать :

 static const progressChannel = const MethodChannel("progress");
  Widget progressBar;

  Future<void> _getProgressBar() async {
    Widget progressBarView;
    try {
      var result = await progressChannel.invokeMapMethod('start');
      print("Result : ---- "   result.toString());
      progressBarView = result as Widget;
    }
    catch (e) {
      print("error channel : "   e.toString());
    }

    setState(() {
      progressBar = progressBarView;
    });
  }
 

Android :

 class MainActivity: FlutterActivity() {

    private val CHANNEL = "progress"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "start") {
                val view = ImageView(this)
                result.success(startProgressBar(view))
            }
        }
    }

    private var vector: AnimatedVectorDrawableCompat? = null

    fun startProgressBar(view: ImageView): ImageView {
        val mainHandler = Handler(Looper.getMainLooper())
        vector = AnimatedVectorDrawableCompat.create(view.context, R.drawable.avd_progress_bar)
        view.setImageDrawable(vector)
        if (vector != null) {
            vector!!.registerAnimationCallback(object : androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback() {
                override fun onAnimationEnd(drawable: Drawable) {
                    super.onAnimationEnd(drawable)
                    mainHandler.post { vector!!.start() }
                }
            })
            vector!!.start()
        }
        return view
    }
}
 

Очевидно, я не могу создать ImageView код из Android и извлечь его.
Ошибка :

 E/MethodChannel#progress(32414): Failed to handle method call
E/MethodChannel#progress(32414): java.lang.IllegalArgumentException: Unsupported value: android.widget.ImageView{40dfc22 V.ED..... ......ID 0,0-0,0}
 

Is there a way to create a native View and retrieve it from Flutter ? Or another way to achieve this ?