Android与Flutter结合使用主要有两种方式:在现有Android应用中嵌入Flutter模块,或在Flutter应用中调用原生Android功能。以下是具体实现方法:
1. 在现有Android应用中嵌入Flutter模块
通过Flutter引擎将Flutter页面集成到Android应用。
步骤:
-
创建Flutter模块
在Android项目同级目录执行:
flutter create -t module my_flutter_module
-
配置Android项目
在settings.gradle中添加:
include ':app'
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir, 'my_flutter_module/.android/include_flutter.groovy'))
-
添加依赖
在App模块的build.gradle中:
dependencies {
implementation project(':flutter')
}
-
启动Flutter页面
在Activity中使用FlutterActivity:
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("/your_route")
.build(this)
)
2. 在Flutter中调用Android原生功能
通过**平台通道(Platform Channel)**实现双向通信。
示例(获取电池电量):
-
Flutter端
import 'package:flutter/services.dart';
class BatteryService {
static const platform = MethodChannel('samples.flutter.dev/battery');
static Future<int> getBatteryLevel() async {
try {
return await platform.invokeMethod('getBatteryLevel');
} on PlatformException {
return -1;
}
}
}
-
Android端
在MainActivity中:
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "samples.flutter.dev/battery").setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
if (batteryLevel != -1) {
result.success(batteryLevel)
} else {
result.error("UNAVAILABLE", "无法获取电量", null)
}
} else {
result.notImplemented()
}
}
}
private fun getBatteryLevel(): Int {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
} else {
-1
}
}
}
注意事项
- 性能:Flutter模块首次加载可能有短暂延迟,建议预初始化Flutter引擎。
- 包体积:集成Flutter会增加APK大小(约20-30MB)。
- 混合路由:需统一处理Flutter与原生页面的跳转逻辑(可使用
flutter_boost等框架)。
通过以上方法,可灵活结合Android与Flutter,逐步迁移或增强现有应用功能。