Flutter Android Package调用python

ops/2024/9/22 21:43:33/

操作步骤

一、创建一个Flutter Package

使用以下指令创建一个Flutter Package

flutter create --template=plugin --platforms=android,ios -a java flutter_package_python

二、修改android/build.gradle文件

在buildscript——>dependencies中添加以下内容

//导入Chaquopy插件,使Android可以使用Python
classpath "com.chaquo.python:gradle:15.0.1"

android上方导入chaquo.python插件

apply plugin: 'com.chaquo.python'

android——>defaultConfig中添加ndk和python配置

       ndk {abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"}python {version "3.8"pip { //根据python用到的依赖进行下载install "scipy"install "numpy" install "PyWavelets"install "scikit-image"install "tflite-runtime"install "statsmodels"}} 

三、编写python文件

android——>src——>main目录下创建名称为calc的python文件,写一个简单的加法函数:

# calc.py
def add(a, b):return a + b

四、创建一个工厂函数,用于初始化Python以及引用Python函数

android——>src——>main——>com——>expample——>flutter_package_python下创建PythonFactory.java文件,对Python进行初始化,以及调用Python中的加法函数

package com.example.flutter_package_python;import android.content.Context;
import com.chaquo.python.PyObject;
import com.chaquo.python.Python;
import com.chaquo.python.android.AndroidPlatform;public class PythonFactory {private static PythonFactory instance = null; // 静态实例private Python pythonInstance; // Python 环境实例private PyObject calcModule; // Python 模块private static boolean isInitialized = false;// 私有化构造函数,确保外部无法直接实例化private PythonFactory(Context context) {if (!isInitialized) {Python.start(new AndroidPlatform(context)); // 需要传入上下文isInitialized = true;}pythonInstance = Python.getInstance(); // 初始化 Python 环境calcModule = pythonInstance.getModule("calc"); // 加载 calc.py 模块}// 获取单例工厂实例public static synchronized PythonFactory getInstance(Context context) {if (instance == null) {instance = new PythonFactory(context); // 初始化一次}return instance;}// 工厂方法:调用 Python 中的加法函数public int addTwoNumbers(int a, int b) {PyObject result = calcModule.callAttr("add", a, b); // 调用 Python 中的 add 方法return result.toInt(); // 将结果返回为整数}
}

五、在FlutterPackagePythonPlugin中使用工厂函数

1.定义pythonFactory变量,在onAttachedToEngine中初始化工厂函数并将结果返回给pythonFactory

  private PythonFactory pythonFactory;@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {// 其他代码pythonFactory = PythonFactory.getInstance(flutterPluginBinding.getApplicationContext());}

2. 在onMethodCall添加判断,当dart中调用了addTwoNumbers函数则使用Python进行相加计算

if (call.method.equals("addTwoNumbers")) {int a = call.argument("a");int b = call.argument("b");// 使用工厂类调用 Python 的加法函数int sum = pythonFactory.addTwoNumbers(a, b);result.success(sum); // 将结果返回给 Flutter 端}

六、编写dart代码调用安卓中的java

在lib/flutter_packages_audio_analysis_platform_interface.dart中添加一个addTwoNumbers函数

Future<int?> addTwoNumbers(int a, int b) {throw UnimplementedError('addTwoNumbers() has not been implemented.');}

在lib/flutter_packages_audio_analysis_method_channel.dart中重写addTwoNumbers方法

 @overrideFuture<int> addTwoNumbers(int a, int b) async {try {final result =await methodChannel.invokeMethod('addTwoNumbers', {'a': a, 'b': b});return result;} on PlatformException catch (e) {print("调用 Python 失败: '${e.message}'.");return -1;}}

3.在lib/FlutterPackagesAudioAnalysis类中添加addTwoNumbers函数

 Future<int?> addTwoNumbers(int a, int b) {return FlutterPackagesAudioAnalysisPlatform.instance.addTwoNumbers(a, b);}

七、写测试代码

import 'package:flutter/material.dart';
import 'dart:async';import 'package:flutter/services.dart';
import 'package:flutter_packages_audio_analysis/flutter_packages_audio_analysis.dart';void main() {runApp(const MyApp());
}class MyApp extends StatefulWidget {const MyApp({super.key});@overrideState<MyApp> createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {String _platformVersion = 'Unknown';final _flutterPackagesAudioAnalysisPlugin = FlutterPackagesAudioAnalysis();@overridevoid initState() {super.initState();initPlatformState();}// Platform messages are asynchronous, so we initialize in an async method.Future<void> initPlatformState() async {String platformVersion;// Platform messages may fail, so we use a try/catch PlatformException.// We also handle the message potentially returning null.try {platformVersion =await _flutterPackagesAudioAnalysisPlugin.getPlatformVersion() ??'Unknown platform version';} on PlatformException {platformVersion = 'Failed to get platform version.';}// If the widget was removed from the tree while the asynchronous platform// message was in flight, we want to discard the reply rather than calling// setState to update our non-existent appearance.if (!mounted) return;setState(() {_platformVersion = platformVersion;});}int addRes = 0;add() async {int a = 8;int b = 9;addRes =await _flutterPackagesAudioAnalysisPlugin.addTwoNumbers(a, b) ?? 100;setState(() {});}add1() async {int a = 8;int b = 19;addRes =await _flutterPackagesAudioAnalysisPlugin.addTwoNumbers(a, b) ?? 100;setState(() {});}@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Plugin example app'),),body: Center(child: Column(mainAxisSize: MainAxisSize.min,children: [Text('Running on: $_platformVersion\n'),ElevatedButton(onPressed: add, child: Text('Add')),Text("相加结果:${addRes}"),ElevatedButton(onPressed: add1, child: Text('Add1')),],),),),);}
}


http://www.ppmy.cn/ops/114429.html

相关文章

Matlab simulink建模与仿真 第十六章(用户定义函数库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、用户定义函数库中的模块概览 注&#xff1a;MATLAB版本不同&#xff0c;可能有些模块也会有差异&#xff0c;但大体上区别是不大的。 二、Fcn/Matlab Fcn模块 1、Fcn模块 双击Fcn模块&#xff0c;在对话…

【Linux】Linux进程的概念

一、冯诺依曼体系结构 我们常见的计算机&#xff0c;比如笔记本&#xff0c;我们不常见的计算机&#xff0c;比如服务器&#xff0c;大部分都遵循冯诺依曼体系结构。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个一个独立的硬件组成&#xff1a; 输入单元&a…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(上)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量和小型系统三方库移植指南…

UnLua扩展C++函数和蓝图自定义事件

一、通过BlueprintImplementableEvent标记扩展C函数 1、 这个标记表示C不需要实现&#xff0c;让蓝图/Lua重写。 2、首先在C中将LuaImp函数标记为BlueprintImplementableEvent&#xff0c;不需要实现&#xff0c;然后再GetIndex中调用该函数。 MyBaseActor.h UFUNCTION(Bluepr…

探讨基于AI技术的相亲交友系统设计与实现

摘要 随着人工智能技术的发展&#xff0c;相亲交友领域也开始引入AI技术来改善用户体验&#xff0c;提高匹配成功率。本文探讨了如何利用AI技术设计并实现一个智能化的相亲交友系统&#xff0c;该系统能够根据用户的行为数据和个人偏好&#xff0c;自动推荐合适的潜在伴侣。通…

2024年华为杯中国研究生数学建模竞赛D题(大数据驱动的地理综合问题)思路

问题1:构建描述性统计方法,分析1990-2020年中国范围内降水量和土地利用/土地覆被类型的时空演化特征 解题思路: 数据处理: 使用数据集3中的降水数据集和数据集4中的土地利用/土地覆被数据集。对于降水数据,需要从1961-2022年逐日的降水数据中,提取1990-2020年间的年平均…

研究生第一次刷力扣day1

1.给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标 直接采用暴力求解&#xff0c;其他解答案看不懂 大致思想&#xff1a;先用len函数求出数组的长度n&#xff0c;然后一个个遍…

内网渗透- 内网渗透的基本知识

攻击流程讲解 内网介绍 内网也指局域网&#xff0c;是指在某一区域内由多台计算机互联而成的计算机组&#xff0c;组网范围通常在数千米以内。在局域网中&#xff0c;可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等。内网是封闭的…