
将 Python 代码集成到 Flutter 应用中
正如上文摘要所述,将 Python 代码集成到 Flutter 应用中,可以为应用带来强大的离线 AI 能力。虽然 Method Channel 是一种可能的方案,但在实际应用中可能存在一些限制。本文将介绍一种更便捷的方法:使用 Flutter-Python Starter Kit。
Flutter-Python Starter Kit 是一个开源项目,它提供了一系列脚本和源文件,可以自动化许多原本需要开发者手动完成的操作。它将成熟且维护良好的技术整合在一起,使它们协同工作。
该工具包主要包含以下三个核心组件:
-
prepare-sources.sh: 该脚本负责安装项目依赖,从 .proto 文件生成 gRPC 存根,创建 Dart 和 Python 的项目框架,并将必要的文件复制到 Flutter 和 Python 项目目录中。这极大地简化了项目初始化的流程。
立即学习“Python免费学习笔记(深入)”;
bundle-python.sh: 该脚本用于创建一个自包含的 Python 可执行文件,并将其作为资源打包到 Flutter 项目中。同时,它还会更新资源的版本信息。这意味着你可以将整个 Python 运行时环境和你的 Python 代码一起打包到应用中,确保在任何设备上都能运行。
templates: 该文件夹包含预先编写好的 Dart 和 Python 文件,用于解决许多常见问题,例如在 Python 端启动 gRPC 服务器、提取和启动独立的 Python 可执行文件,以及启动 gRPC 客户端通道等。这些模板为开发者提供了快速入门的脚手架。
使用步骤示例:
以下是一个简化的使用流程,展示如何使用 Flutter-Python Starter Kit 将一个简单的 Python 函数集成到 Flutter 应用中。
-
准备 Python 代码: 编写你的 Python 代码,例如一个简单的加法函数 add.py:
def add(a, b): return a + b if __name__ == '__main__': result = add(5, 3) print(result) 配置 Flutter-Python Starter Kit: 按照 Starter Kit 的文档,配置 prepare-sources.sh 和 bundle-python.sh 脚本,确保它们指向正确的 Python 代码路径和 Flutter 项目路径。
运行脚本: 首先运行 prepare-sources.sh,然后运行 bundle-python.sh。 这些脚本将自动生成必要的文件,并将 Python 可执行文件打包到 Flutter 项目的 assets 目录下。
-
在 Flutter 中调用 Python 代码: 在 Flutter 代码中,使用 Starter Kit 提供的辅助函数来加载和执行 Python 可执行文件,并调用你的 Python 函数。 这通常涉及到使用 gRPC 或其他进程间通信机制。 以下是一个简化的示例(需要根据 Starter Kit 的具体实现进行调整):
import 'package:flutter/services.dart'; import 'dart:io'; Future
runPython() async { // 假设 Python 可执行文件位于 assets/python/main.exe final ByteData data = await rootBundle.load('assets/python/main.exe'); final List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); // 将可执行文件写入临时目录 final Directory tempDir = await getTemporaryDirectory(); final File executable = File('${tempDir.path}/main.exe'); await executable.writeAsBytes(bytes, flush: true); // 设置可执行权限 (Linux/macOS) if (!Platform.isWindows) { await Process.run('chmod', ['+x', executable.path]); } // 运行 Python 可执行文件 final ProcessResult result = await Process.run(executable.path, []); // 返回 Python 程序的输出 return result.stdout; } // 在 Flutter UI 中调用 ElevatedButton( onPressed: () async { String output = await runPython(); print('Python Output: $output'); // 期望输出: 8 }, child: Text('Run Python'), );
注意事项:
- 依赖管理: 确保你的 Python 代码所需的所有依赖都包含在打包的可执行文件中。可以使用工具如 PyInstaller 或 Nuitka 来创建自包含的 Python 可执行文件。
- 平台兼容性: 打包的 Python 可执行文件需要与目标平台(Android, iOS, Web 等)兼容。 可能需要为不同的平台构建不同的可执行文件。
- 性能: 在移动设备上运行 Python 代码可能会消耗较多的资源。 需要仔细评估性能,并考虑优化 Python 代码。
- 安全性: 确保你信任你集成的 Python 代码,避免安全漏洞。
总结:
Flutter-Python Starter Kit 提供了一种相对简单的方式将 Python 代码集成到 Flutter 应用中。 通过自动化构建和打包流程,开发者可以更专注于编写 Python 代码,并将其无缝集成到 Flutter 应用中,从而实现强大的离线 AI 功能。 然而,需要注意依赖管理、平台兼容性、性能和安全性等方面的问题。 在实际应用中,请仔细阅读 Starter Kit 的文档,并根据你的具体需求进行调整。










