我已经通过以下步骤成功地在我的原生android应用程序中集成了flutter模块。
缓存flutter引擎的过程我已经在应用程序类中完成了。我正在用这个来自安卓的碎片启动我的flutter屏幕。
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.build(currentActivity)
);
现在,我想将我的auth token
传递给flutter模块,以便进行api调用。
我从这里开始遵循这个过程,并在dart代码中创建了方法通道,但我不知道在本地端的哪里创建method channel
。
如果我在project/moduleName/.android/app/src/main/java/com/package/host/MainActivity.java
中创建它
它给出异常Unhandled Exception: MissingPluginException(No implementation found for method
还要注意的是,当我在Android studio中创建这个flutter模块时,默认情况下,这个文件夹被放置在.gitignore
中。
我已经看了一些旧的教程,但它们中没有这种颤振引擎选项的缓存。
请告诉我哪里做错了?
您需要有一个Flutter引擎的引用,然后使用它来创建方法通道。考虑到启动Flutter活动的活动/片段负责管理方法通道。
private const val FLUTTER_ENGINE_ID = "flutter_engine"
private const val CHANNEL = "myApp.flutter.dev/auth"
class MainActivity : AppCompatActivity(R.layout.activity_main) {
private lateinit var flutterEngine: FlutterEngine
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupFlutterEngine()
setupMethodChannel()
setSupportActionBar(findViewById(R.id.toolbar))
fab.setOnClickListener {
launchFlutterModule()
}
}
private fun setupFlutterEngine() {
createAndConfigureFlutterEngine()
FlutterEngineCache
.getInstance()
.put(FLUTTER_ENGINE_ID, flutterEngine)
}
private fun createAndConfigureFlutterEngine() {
flutterEngine = FlutterEngine(this)
flutterEngine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
}
private fun setupMethodChannel() {
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
CHANNEL
).setMethodCallHandler { call, result ->
// All your implementation for auth token
}
}
private fun launchFlutterModule() {
startActivity(getFlutterIntent())
}
private fun getFlutterIntent(): Intent {
return FlutterActivity
.withCachedEngine(FLUTTER_ENGINE_ID)
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(this)
}
}
你可以制作一个Wrapper
,在那里你可以保存方法通道代码和flutter引擎设置,这个包装器是Application
类中的init,或者可能是init,并在需要的地方注入Dagger
或Hilt
。
您可以将简单数据作为请求参数进行传递。安卓代码:
FlutterActivity
.withNewEngine()
.initialRoute("/MyPage?username=my_user&age=30&gender=male")
.build(MainActivity.this)
Flutter代码,我使用GetX库来获取的参数
Map<String, String?> parameters = Get.parameters;
print("parameters: $parameters");
输出:
parameters: {username: my_user, age: 30, gender: male}
- 首先创建带有通道的flutter平台客户端
- set methodCallHamdler通过相同通道请参阅本官方文件-https://flutter.dev/docs/development/platform-integration/platform-channels