【问题标题】:How to add Method Channel to Flutter Fragment如何将方法通道添加到 Flutter 片段
【发布时间】:2020-05-30 08:51:27
【问题描述】:

由于我已将 Flutter SDK 升级到 1.12.13+hotfix.8,片段中较旧的 FlutterView 实现不再工作,因为外观(Flutter)库现已弃用。

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

根据官方文档,我们可以像下面这样添加一个 FlutterFragment -

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

但找不到如何在扩展 Flutter 片段的自定义 Flutter 片段中添加方法通道。

【问题讨论】:

标签: android android-fragments flutter dart flutter-dependencies


【解决方案1】:

这就是我将颤振引擎与颤振片段连接的方式,它工作得非常好。如果你使用缓存的引擎和片段,即使你重新打开它,屏幕也会保持状态。如果您不想保存片段状态,请避免缓存。

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()
            }
        }
    }
}

【讨论】:

  • 感谢您的回答。我在这里描述了类似的问题stackoverflow.com/questions/62746709/…。是否可以使用 FlutterFragment 来做到这一点?
  • @Sumit 你救了我的命,这是我正在寻找的完整答案,谢谢
  • @Sumit Saurabh 当我在颤振片段原生片段之上添加原生片段时,我遇到了另一个问题,不可见任何想法
【解决方案2】:

Flutter Fragment 处于实验阶段,虽然可以如下使用:

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

希望对你有帮助

【讨论】:

  • 方法通道如何配合使用?虽然我已经想通了,但很快就会发布我的工作解决方案。
猜你喜欢
  • 2022-11-07
  • 2017-04-14
  • 2016-06-27
  • 2012-11-18
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多