You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中点击按钮调用外部脚本(Python/C++等)的实现方法

Flutter调用外部脚本/程序并获取返回值的标准实现方案

一、直接调用系统进程(桌面端优先推荐)

利用Dart内置的Process类或第三方包process_run,直接执行系统命令调用脚本,适合Windows/macOS/Linux桌面平台(这类系统通常自带Python环境)。

步骤示例:

  1. 编写Python脚本(calculate_square.py)
import sys

if __name__ == "__main__":
    try:
        num = float(sys.argv[1])
        print(num ** 2)
    except Exception as e:
        print(f"Error: {e}")
        sys.exit(1)
  1. Flutter中调用并获取结果
import 'dart:io';
import 'dart:convert';

// 点击按钮触发的方法
Future<void> calculateSquare(String input) async {
  try {
    // 调用Python脚本,传入输入参数
    final process = await Process.start(
      'python', // 根据系统环境调整为python3
      ['calculate_square.py', input],
      workingDirectory: Directory.current.path, // 脚本所在路径
    );

    // 读取标准输出
    final output = await process.stdout.transform(utf8.decoder).join();
    // 读取错误输出
    final error = await process.stderr.transform(utf8.decoder).join();

    await process.exitCode;

    if (error.isNotEmpty) {
      print('执行出错:$error');
      return;
    }

    print('计算结果:$output');
    // 将结果更新到Flutter界面
  } catch (e) {
    print('调用失败:$e');
  }
}

二、移动端调用Python脚本(需打包Python环境)

Android/iOS没有默认Python环境,需把Python解释器和脚本一起打包,推荐使用flutter_python插件(封装了移动端Python运行环境)。

步骤示例:

  1. 添加依赖到pubspec.yaml
dependencies:
  flutter_python: ^0.5.0
  1. 初始化并调用脚本
import 'package:flutter_python/flutter_python.dart';

// 初始化Python环境
Future<void> initPython() async {
  await FlutterPython.startPython();
}

// 计算平方的方法
Future<String?> calculateSquare(String input) async {
  try {
    // 直接执行Python代码,也可通过executeScript加载本地脚本文件
    final result = await FlutterPython.executeCode('''
num = float("$input")
print(num ** 2)
''');
    return result;
  } catch (e) {
    print('执行出错:$e');
    return null;
  }
}

// 页面销毁时停止Python环境
@override
void dispose() {
  FlutterPython.stopPython();
  super.dispose();
}

若需使用第三方Python包,需将相关文件打包到项目assets目录,通过FlutterPython.executeScript加载,具体参考插件文档。

三、调用C/C++程序(高性能场景推荐)

对性能要求高的底层操作(如图片压缩、数值计算),推荐使用Dart的**FFI(Foreign Function Interface)**直接调用C/C++编译的动态链接库(.dll/.so/.dylib)。

步骤示例:

  1. 编写C++代码(calculator.cpp)
extern "C" {
    double calculate_square(double num) {
        return num * num;
    }
}
  1. 编译为动态链接库
  • Windows:用MinGW编译为calculator.dll
  • macOS:编译为libcalculator.dylib
  • Linux:编译为libcalculator.so
  1. Flutter中通过FFI调用
import 'dart:ffi';
import 'dart:io';
import 'package:ffi/ffi.dart';

// 定义函数签名
typedef CalculateSquareFunc = Double Function(Double);
typedef CalculateSquare = double Function(double);

// 加载动态链接库
final DynamicLibrary nativeLib = Platform.isWindows
    ? DynamicLibrary.open('calculator.dll')
    : Platform.isMacOS
        ? DynamicLibrary.open('libcalculator.dylib')
        : DynamicLibrary.open('libcalculator.so');

// 获取函数指针
final CalculateSquare calculateSquare = nativeLib
    .lookup<NativeFunction<CalculateSquareFunc>>('calculate_square')
    .asFunction();

// 调用方法
void getSquareResult(String input) {
  try {
    double num = double.parse(input);
    double result = calculateSquare(num);
    print('计算结果:$result');
    // 更新界面
  } catch (e) {
    print('输入错误:$e');
  }
}

四、其他补充方案

  • REST API:将Python/C++程序封装为后端服务,Flutter通过HTTP请求调用,适合多端共享逻辑的场景。
  • 自定义Flutter插件:在原生层(Android用JNI、iOS用Objective-C)封装外部程序调用逻辑,再暴露给Dart层,适合高度定制的需求。

内容的提问来源于stack exchange,提问作者0xgarry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:01:20