Flutter混合开发 引用Android 第三方jar包 使用官方推荐的插件方式

最近项目需要实现移动端IM系统,百度了IM很久发现即时通讯网的MobileIMSDK框架不错,但是他没有实现flutter版本的代码,于是决定使用flutter调用它的Android_MobileIMSDKSDK库。

使用flutter调用jar包,百度发现(别人的文章要么年代久远,要么写得很模糊)只有一个插件flutter_MobileIMSDK_TCP,但是已经不支持dart3了,于是决定模仿他的框架。由于这个是个插件但是项目需求是直接嵌入到flutter项目内部,在模仿的时候踩了很多坑。废话不多说,直接上教程(部分代码来自deepseek)

1. 添加 JAR 包到 Android 项目

将你的 JAR 文件放入 android/app/libs 目录中。如果没有 libs 目录,可以手动创建一个。

2. 配置 build.gradle

打开 android/app/build.gradle 文件,确保在 dependencies 部分添加了对 JAR 文件的依赖:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //或者直接指定jar包围着(自己百度)
    *****************
}

3. 创建 Flutter 平台通道

在 android/app/src/main/java/com/example/my_flutter_app/ 目录下创建一个新的 Java 类,例如 MyPlugin.java。这个类将用于处理 Flutter 与原生 Android 代码之间的通信。

package com.example.my_flutter_app;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;

/** MyPlugin */
public class MyPlugin implements FlutterPlugin, MethodCallHandler {
  private MethodChannel channel;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "my_flutter_app");
    channel.setMethodCallHandler(this);
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("getMessageFromJar")) {
      // 调用 JAR 包中的方法
      String message = MyJarClass.getMessage();
      result.success(message);
    } else {
      result.notImplemented();
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
}

4. 注册插件

在 MainActivity.java 中注册插件:

(位于android/app/src/main/java/xxx/xxx/MainActivity.java 发现使用VsCode生成的flutter项目没有这个文件,建议使用Android Studio创建项目。这步必须实现,否则dart代码搜索不到android包内java代码。本人因为借鉴别人上个插件的写法所以一直缺少这个部分导致一直报错

MissingPluginException(No implementation found for method *** on channel ***)

package com.example.my_flutter_app;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);
    flutterEngine.getPlugins().add(new MyPlugin());
  }
}

5. 在 Flutter 中调用平台代码

在 Flutter 中,你可以通过 MethodChannel(官方推荐的方法,百度吧) 调用刚刚创建的 Java 代码:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter with JAR'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              const platform = MethodChannel('my_flutter_app');
              try {
                final String result = await platform.invokeMethod('getMessageFromJar');
                print(result);
              } on PlatformException catch (e) {
                print("Failed to get message: '${e.message}'.");
              }
            },
            child: Text('Get Message from JAR'),
          ),
        ),
      ),
    );
  }
}

7. 运行项目

确保你的 Android 设备或模拟器已经连接,然后运行项目:

flutter clean
flutter pub get
flutter run

8. 最后

只要flutter版本大于3.2  文章没提到的配置文件一律不需要动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值