Как добавить метод канала к фрагменту флаттера - PullRequest
0 голосов
/ 14 февраля 2020

Поскольку я обновил Flutter SDK до 1.12.13 + hotfix.8, более старая реализация FlutterView во фрагменте больше не работает, поскольку библиотека фасадов (Flutter) устарела.

Flutter.createView(activity!!, lifecycle, mRoute)

Согласно Официально сделав c, мы можем добавить FlutterFragment, как показано ниже -

FlutterFragment flutterFragment = FlutterFragment.withNewEngine()
    .initialRoute("myInitialRoute/")
    .build();

Но не смог найти, как добавить канал метода в пользовательский фрагмент флаттера, который расширяет фрагмент Флаттера.

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вот так я прикрепил движок флаттера к фрагменту флаттера, и он работал отлично. Если вы используете кэшированный движок и фрагмент, экран сохранит состояние, даже если вы снова откроете его. Избегайте кэширования, если вы не хотите сохранять состояние фрагмента.

package com.test.app

import io.flutter.embedding.android.FlutterFragment
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.FlutterEngineCache
import io.flutter.embedding.engine.dart.DartExecutor
import io.flutter.plugin.common.MethodChannel

class SampleActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        initFlutterEngine()
        attachFlutterFragment()
    }

    private fun initFlutterEngine(): FlutterEngine {
        var flutterEngine = FlutterEngineCache.getInstance().get(ENGINE_ID)

        if (null == flutterEngine) {
            flutterEngine = FlutterEngine(this)
            flutterEngine.navigationChannel.setInitialRoute("/")
            flutterEngine.dartExecutor.executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
            )
            FlutterEngineCache
                .getInstance()
                .put(ENGINE_ID, flutterEngine)
            setMethodChannels(flutterEngine)
        }
        return flutterEngine
    }

    private attachFlutterFragment() {
        var flutterFragment = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) as FlutterFragment?
        if (null == flutterFragment) {
            flutterFragment =
                FlutterFragment.withCachedEngine(ENGINE_ID)
                    .shouldAttachEngineToActivity(true)
                    .build() as FlutterFragment
        }

        supportFragmentManager
            .beginTransaction()
            .add(R.id.flutter_fragment_container,
                 flutterFragment,
                 FRAGMENT_TAG
            )
            .commit()
    }

    private fun setMethodChannels(flutterEngine: FlutterEngine) {
        MethodChannel(flutterEngine.dartExecutor, FLUTTER_CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                DUMMY_METHOD -> {
                    val params = HashMap<String, String>()

                    result.success(params)
                }
                else -> result.notImplemented()
            }
        }
    }
}
0 голосов
/ 04 марта 2020

Фрагмент флаттера находится в экспериментальной фазе, хотя его можно использовать следующим образом:

var experimentalFlutterFragment = FlutterFragment.createDefault()
      flutterFragment = experimentalFlutterFragment
      fragmentManager
        .beginTransaction()
        .add(
          R.id.fragment_android,
          experimentalFlutterFragment,
          TAG_FLUTTER_FRAGMENT
        )
        .commit()

Надеюсь, я вам помог

...