Flutter集成starflut包时遭遇大量异常无法解决的求助
排查并解决Flutter中starflut包的异常问题
我来帮你一步步排查这个starflut包的异常问题,先从几个常见的坑入手:
1. 确认依赖与环境适配
- 版本兼容性:starflut这类底层交互包对Flutter SDK版本很敏感,你用了
flutter run --no-sound-null-safety,要确保pubspec.yaml里不仅正确引入了starflut,还声明了兼容非空安全的SDK范围,比如:
同时要确认starflut的版本确实支持非空安全,或者和你的Flutter版本匹配。environment: sdk: ">=2.12.0 <3.0.0" dependencies: starflut: ^x.x.x # 替换成你实际使用的版本 - Android配置要求:starflut通常要求Android的
minSdkVersion至少为21,你可以打开android/app/build.gradle,检查defaultConfig里的minSdkVersion是否符合要求。
2. 检查资源文件与路径配置
你代码里加载了Python相关的库和脚本,这些资源必须正确配置:
- Assets声明:所有要加载的文件(比如
python3.9.zip、zlib.cpython-39.so、abc.py等)都要在pubspec.yaml的assets节点里声明,比如:assets: - python3.9.zip - abc.py - x86_64/zlib.cpython-39.so - x86_64/unicodedata.cpython-39.so - arm64/zlib.cpython-39.so - arm64/unicodedata.cpython-39.so # 其他架构的对应文件也要加上 - 文件路径正确性:确保这些文件确实放在了项目根目录对应的路径下,比如
x86_64文件夹要和lib、android文件夹同级。
3. 修正代码逻辑中的潜在问题
你的代码里有几个容易导致异常的点:
- 错误捕获与打印:原代码里的
print("{$e.message}");有问题,Dart的Exception对象不一定有message属性,改成下面的方式才能正确打印错误信息,帮你定位具体问题:catch (e) { print("Error occurred: $e"); log("", error: e); // 打印堆栈信息,更方便排查根源 } - 库文件名问题:Android端加载.so库时,有时候不需要加
lib前缀,你可以把await Starflut.loadLibrary("libpython3.9.so");改成await Starflut.loadLibrary("python3.9.so");试试。 - 服务清理时机:你在加载完Python模块后立刻调用了
clearService和moduleExit,这会导致Python模块还没执行就被销毁,应该在执行完你的Python业务逻辑之后再清理服务。
4. 清理缓存并重新构建
有时候缓存会导致奇怪的异常,试试以下步骤:
- 执行
flutter clean清理项目缓存 - 执行
flutter pub get重新获取依赖 - 再用
flutter run --no-sound-null-safety启动项目 - 如果用模拟器,建议换arm64架构的模拟器,x86架构可能存在库兼容问题
修正后的示例代码
这里给你调整后的核心代码,优化了错误处理和服务清理时机:
import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:starflut/starflut.dart'; import 'dart:async'; import 'package:flutter/services.dart'; void main() { runApp(MaterialApp(home: const MyApp())); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( body: GestureDetector( onTap: () async { await initpla(); }, child: Container( width: 350, height: 500, color: Colors.blue, ), ), ); } Future<void> initpla() async { try { StarCoreFactory starcore = await Starflut.getFactory(); StarServiceClass Service = await starcore.initSimple("test", "123", 0, 0, []); await starcore.regMsgCallBackP( (int serviceGroupID, int uMsg, Object wParam, Object lParam) async { print("$serviceGroupID $uMsg $wParam $lParam"); return null; }); dynamic SrvGroup = await Service["_ServiceGroup"]; bool isAndroid = await Starflut.isAndroid(); if (isAndroid == true) { // 尝试去掉lib前缀加载Python库 await Starflut.loadLibrary("python3.9.so"); await Starflut.copyFileFromAssets( "python3.9.zip", "flutter_assets/starflut", null); var nativepath = await Starflut.getNativeLibraryDir(); print("Nativepath : $nativepath"); var LibraryPath = ""; if (nativepath.contains("x86_64")) LibraryPath = "x86_64"; else if (nativepath.contains("arm64")) LibraryPath = "arm64"; else if (nativepath.contains("arm")) LibraryPath = "armeabi"; else if (nativepath.contains("x86")) LibraryPath = "x86"; await Starflut.copyFileFromAssets( "zlib.cpython-39.so", LibraryPath, null); await Starflut.copyFileFromAssets( "unicodedata.cpython-39.so", LibraryPath, null); String docPath = await Starflut.getDocumentPath(); print("docPath = $docPath"); String resPath = await Starflut.getResourcePath(); print("resPath = $resPath"); dynamic rr1 = await SrvGroup.initRaw("python39", Service); var Result = await SrvGroup.loadRawModule( "python", "", resPath + "/" + "abc.py", false); print("loadRawModule result = $Result"); // 这里可以添加你的Python业务逻辑,比如调用abc.py中的函数 // dynamic python = await Service.importRawContext(null, "python", "", false, ""); // await python.your_function_name(); // 等业务逻辑执行完再清理服务 await SrvGroup.clearService(); await starcore.moduleExit(); print("Python 3.9 initialized successfully!"); } } catch (e) { print("Error occurred: $e"); log("", error: e); } } }
内容的提问来源于stack exchange,提问作者Akshat Sharma
相关产品推荐
相关产品推荐

