如何将方法通道添加到 Flutter Fragment
How to add Method Channel to Flutter Fragment
由于我已将 flutter SDK 升级到 1.12.13+hotfix.8,片段中较旧的 FlutterView 实现不再工作,因为现在不推荐使用外观 (Flutter) 库。
Flutter.createView(activity!!, lifecycle, mRoute)
根据官方文档,我们可以添加如下所示的 FlutterFragment -
FlutterFragment flutterFragment = FlutterFragment.withNewEngine()
.initialRoute("myInitialRoute/")
.build();
但找不到如何在扩展 Flutter 片段的自定义 Flutter 片段中添加方法通道。
Flutter fragment 处于实验阶段,但可以按如下方式使用:
var experimentalFlutterFragment = FlutterFragment.createDefault()
flutterFragment = experimentalFlutterFragment
fragmentManager
.beginTransaction()
.add(
R.id.fragment_android,
experimentalFlutterFragment,
TAG_FLUTTER_FRAGMENT
)
.commit()
希望对你有所帮助
这就是我将 flutter 引擎与 flutter 片段连接的方式,它运行得非常好。如果你使用缓存的引擎和片段,即使你重新打开它,屏幕也会保持状态。如果不想保存片段状态,请避免缓存。
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()
}
}
}
}
由于我已将 flutter SDK 升级到 1.12.13+hotfix.8,片段中较旧的 FlutterView 实现不再工作,因为现在不推荐使用外观 (Flutter) 库。
Flutter.createView(activity!!, lifecycle, mRoute)
根据官方文档,我们可以添加如下所示的 FlutterFragment -
FlutterFragment flutterFragment = FlutterFragment.withNewEngine()
.initialRoute("myInitialRoute/")
.build();
但找不到如何在扩展 Flutter 片段的自定义 Flutter 片段中添加方法通道。
Flutter fragment 处于实验阶段,但可以按如下方式使用:
var experimentalFlutterFragment = FlutterFragment.createDefault()
flutterFragment = experimentalFlutterFragment
fragmentManager
.beginTransaction()
.add(
R.id.fragment_android,
experimentalFlutterFragment,
TAG_FLUTTER_FRAGMENT
)
.commit()
希望对你有所帮助
这就是我将 flutter 引擎与 flutter 片段连接的方式,它运行得非常好。如果你使用缓存的引擎和片段,即使你重新打开它,屏幕也会保持状态。如果不想保存片段状态,请避免缓存。
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()
}
}
}
}