如何将Android .aar库集成到Flutter项目并调用其函数?
Flutter集成本地AAR依赖并调用方法的完整步骤
一、已完成的基础配置回顾
你已经在Flutter项目的android目录下创建linklibrary文件夹,放入E4link-1.0.0.aar,并在该文件夹的build.gradle中添加了以下代码:
configurations.maybeCreate("default") artifacts.add("default", file('E4link-1.0.0.aar'))
二、配置项目级build.gradle
打开android/build.gradle,在allprojects的repositories块中添加本地文件夹引用:
allprojects { repositories { google() mavenCentral() // 添加本地AAR所在文件夹的引用 flatDir { dirs 'linklibrary' } } }
三、配置app级build.gradle
打开android/app/build.gradle,在dependencies块中添加AAR依赖:
dependencies { // 保留原有依赖,新增这行 implementation(name: 'E4link-1.0.0', ext: 'aar') }
注意:如果AAR依赖其他Android库(如AndroidX组件、第三方SDK),需要在此处同步添加对应依赖,否则会出现编译报错。
四、搭建Flutter与原生的通信通道(MethodChannel)
1. 编写Android原生端代码
打开android/app/src/main/kotlin/你的包名/MainActivity.kt(Java项目则打开MainActivity.java),实现MethodChannel的调用逻辑:
Kotlin示例:
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { // 自定义通道名,需和Flutter端完全一致 private val CHANNEL = "com.example.e4link/channel" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> // 根据Flutter调用的方法名,执行AAR中的对应函数 when (call.method) { "invokeE4linkMethod" -> { // 示例:获取Flutter传递的参数 val inputParam = call.argument<String>("input") // 调用AAR中的目标方法(需替换为实际类和方法名) val methodResult = E4linkCore.processData(inputParam) // 将结果返回给Flutter result.success(methodResult) } else -> { // 未匹配到方法时返回异常 result.notImplemented() } } } } }
Java示例:
import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugin.common.MethodChannel; public class MainActivity extends FlutterActivity { private static final String CHANNEL = "com.example.e4link/channel"; @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler( (call, result) -> { if (call.method.equals("invokeE4linkMethod")) { String inputParam = call.argument("input"); String methodResult = E4linkCore.processData(inputParam); result.success(methodResult); } else { result.notImplemented(); } } ); } }
注意:确保正确导入AAR中的类,若出现类找不到的情况,检查依赖配置是否正确,或确认AAR是否暴露了该类的公开方法。
2. 编写Flutter端调用代码
在Flutter的Dart文件(如main.dart)中,通过MethodChannel调用原生方法:
import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; class _HomePageState extends State<HomePage> { static const MethodChannel _channel = MethodChannel('com.example.e4link/channel'); String _callResult = "未调用"; Future<void> _callE4linkMethod() async { try { // 调用原生方法,传递参数 final String result = await _channel.invokeMethod( 'invokeE4linkMethod', {'input': '来自Flutter的测试参数'} ); setState(() { _callResult = "调用结果:$result"; }); } on PlatformException catch (e) { setState(() { _callResult = "调用失败:${e.message}"; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("调用AAR方法")), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(_callResult), const SizedBox(height: 20), ElevatedButton( onPressed: _callE4linkMethod, child: const Text("触发AAR函数调用"), ) ], ), ), ); } }
五、编译运行项目
- 执行命令清理缓存:
flutter clean - 启动项目:
flutter run - 点击页面按钮即可测试AAR方法的调用
常见问题排查
- 找不到AAR中的类:检查app级build.gradle的依赖配置、AAR存放路径、项目级build.gradle的flatDir配置是否正确
- 依赖冲突:查看AAR的依赖清单,在app级build.gradle的implementation中通过
exclude group: 'xxx', module: 'xxx'排除冲突依赖 - 调用提示
notImplemented:确认Flutter端与原生端的通道名、方法名完全一致
内容的提问来源于stack exchange,提问作者Nns_ninteyFIve
相关产品推荐
相关产品推荐

