Android和Flutter如何结合使用

我想在现有的Android原生应用中集成Flutter模块,但不太清楚具体该如何操作。有哪些可行的方案可以将Flutter和Android结合起来使用?是否需要重新构建整个应用,还是可以逐步迁移部分功能到Flutter?另外,这种混合开发模式下,Flutter和原生代码之间如何通信,性能方面会有哪些影响?希望有经验的朋友能分享一下最佳实践和注意事项。

2 回复

Android与Flutter结合使用主要通过Flutter模块集成到现有Android项目。使用FlutterFragment或FlutterView嵌入原生界面,通过MethodChannel实现双向通信。适合渐进式迁移或混合开发。

更多关于Android和Flutter如何结合使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Android与Flutter结合使用主要有两种方式:在现有Android应用中嵌入Flutter模块,或在Flutter应用中调用原生Android功能。以下是具体实现方法:

1. 在现有Android应用中嵌入Flutter模块

通过Flutter引擎将Flutter页面集成到Android应用。

步骤:

  1. 创建Flutter模块
    在Android项目同级目录执行:

    flutter create -t module my_flutter_module
    
  2. 配置Android项目
    settings.gradle中添加:

    include ':app'
    setBinding(new Binding([gradle: this]))
    evaluate(new File(settingsDir, 'my_flutter_module/.android/include_flutter.groovy'))
    
  3. 添加依赖
    在App模块的build.gradle中:

    dependencies {
        implementation project(':flutter')
    }
    
  4. 启动Flutter页面
    在Activity中使用FlutterActivity

    startActivity(
        FlutterActivity
            .withNewEngine()
            .initialRoute("/your_route")
            .build(this)
    )
    

2. 在Flutter中调用Android原生功能

通过**平台通道(Platform Channel)**实现双向通信。

示例(获取电池电量):

  1. 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;
        }
      }
    }
    
  2. 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,逐步迁移或增强现有应用功能。

回到顶部