Flutter本地资源管理插件native_assets_cli的使用
Flutter本地资源管理插件native_assets_cli的使用
插件简介
native_assets_cli 是一个用于捆绑Dart包中的原生代码的CLI工具。它允许开发者将C/C++/Rust等编写的原生库与Dart或Flutter应用集成,并在构建过程中自动处理这些资源。
状态:实验性
请注意,此包目前处于实验阶段,发布在labs.dart.dev pub发行商下以征求反馈。对于labs.dart.dev发行商下的包,我们通常计划在经过一段时间的反馈和迭代后,将其升级为受支持的发行商(如dart.dev, tools.dart.dev),或者停止该包。这些包的API和破坏性变化的预期率要高得多。您的反馈对我们改进这个包非常重要,有关bug请在bug tracker中提交问题;对于关于Dart和Flutter中本地资产功能的一般反馈和建议,请评论在dart-lang#50565 或 flutter#129757。
示例项目结构
一个典型的包含本地代码的包布局如下:
lib/
包含使用dart:ffi 和 package:ffigen 调用本地代码的Dart代码。src/
包含通过dart:ffi
调用的C/C++/Rust代码。hook/build.dart
实现了与Dart/Flutter SDK通信的CLI,指明要构建/捆绑哪些本地资产。此文件使用本包中指定的协议。
示例可以在example/build/找到。
使用方法
使用本地资产特性需要在Dart的开发版本中传递--enable-experiment=native-assets
参数。注意,当前版本的Flutter还不支持这一特性。
开发进展
该特性的开发进展可以在dart-lang#50565,flutter#129757以及本仓库的问题跟踪器中追踪。
完整示例Demo
假设我们要创建一个简单的Flutter应用程序,该应用程序包含一个由C语言编写的函数,用于计算两个整数的和。我们将演示如何使用native_assets_cli
来管理和打包这个C库。
1. 创建一个新的Flutter项目
flutter create native_assets_example
cd native_assets_example
2. 添加依赖项
编辑pubspec.yaml
文件,在dependencies
部分添加native_assets_cli
:
dependencies:
flutter:
sdk: flutter
native_assets_cli: any
然后运行flutter pub get
来安装新的依赖项。
3. 创建C库
在项目根目录下创建一个名为src
的新文件夹,并在其中添加一个名为sum.c
的文件,内容如下:
#include <stdint.h>
int32_t sum(int32_t a, int32_t b) {
return a + b;
}
4. 编写build脚本
接下来,在项目的根目录下创建一个名为hook
的新文件夹,并在其中添加一个名为build.dart
的文件,内容如下:
import 'dart:io';
import 'package:native_assets_cli/native_assets_cli.dart';
Future<void> main(List<String> args) async {
final cli = NativeAssetsCli(args);
await cli.run();
}
5. 修改Dart代码以使用FFI调用C库
在lib/main.dart
中修改代码,使其能够调用刚刚创建的C库:
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'dart:io' show Platform;
typedef SumNative = Int32 Function(Int32 a, Int32 b);
typedef SumDart = int Function(int a, int b);
void main() {
WidgetsFlutterBinding.ensureInitialized();
DynamicLibrary dylib;
if (Platform.isAndroid || Platform.isLinux) {
dylib = DynamicLibrary.open("libsum.so");
} else if (Platform.isWindows) {
dylib = DynamicLibrary.open("sum.dll");
} else if (Platform.isMacOS) {
dylib = DynamicLibrary.open("libsum.dylib");
}
final sumPtr = dylib.lookupFunction<SumNative, SumDart>('sum');
runApp(MyApp(sum: sumPtr));
}
class MyApp extends StatelessWidget {
final SumDart sum;
const MyApp({required this.sum});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'The sum of 3 and 4 is ${sum(3, 4)}',
),
],
),
),
),
);
}
}
6. 构建和运行
确保您已经配置好了环境变量,并且可以编译C代码。然后您可以使用以下命令来构建和运行您的应用程序:
dart run native_assets_cli compile --target-platform android-arm64 # 根据需要更改平台
flutter run
以上步骤展示了如何使用native_assets_cli
来管理Flutter应用中的本地资源。希望这可以帮助您开始使用这个强大的工具!
更多关于Flutter本地资源管理插件native_assets_cli的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地资源管理插件native_assets_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用native_assets_cli
插件来管理本地资源的详细步骤和代码案例。native_assets_cli
插件可以帮助你将本地资源(如图片、音频文件等)打包并嵌入到你的Flutter应用中,以便在运行时轻松访问。
步骤 1: 安装插件
首先,你需要在你的Flutter项目中安装native_assets_cli
。打开你的终端并运行以下命令:
flutter pub add native_assets_cli
步骤 2: 配置pubspec.yaml
在你的pubspec.yaml
文件中,添加对native_assets_cli
的依赖项(如果上述命令没有自动添加的话):
dependencies:
flutter:
sdk: flutter
native_assets_cli: ^x.y.z # 替换为最新版本号
步骤 3: 创建资源文件夹
在你的项目根目录下创建一个文件夹来存放你的资源文件。例如,创建一个名为assets
的文件夹:
your_flutter_project/
├── android/
├── ios/
├── assets/ # 新建的文件夹
│ ├── images/
│ │ └── example.png
│ └── audios/
│ └── example.mp3
├── lib/
│ └── main.dart
├── pubspec.yaml
└── ...
步骤 4: 使用native_assets_cli生成资源文件
在终端中导航到你的项目根目录,然后运行以下命令来生成资源文件:
flutter pub run native_assets_cli:copy_assets -s assets -d android/app/src/main/res -i ios/Runner/Resources
这条命令会将assets
文件夹中的资源复制到Android和iOS项目的相应资源目录中。
步骤 5: 在Flutter代码中访问资源
现在,你可以在Flutter代码中访问这些资源了。例如,访问example.png
图片:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Asset Example'),
),
body: Center(
child: Image.asset('assets/images/example.png'), // 引用资源
),
),
);
}
}
注意,由于你已经通过native_assets_cli
将资源复制到了原生平台的资源目录中,因此在Flutter中引用这些资源时,路径仍然是从assets
开始。
注意事项
- 资源路径:确保在Flutter代码中引用的资源路径与你在
native_assets_cli
命令中指定的源文件夹结构相匹配。 - 插件版本:检查
native_assets_cli
插件的最新版本和文档,以确保所有命令和配置都是最新的。 - 清理和重建:在修改了资源或运行了
native_assets_cli
命令后,建议清理并重建你的项目,以确保所有更改都已生效。
通过以上步骤,你就可以在Flutter项目中使用native_assets_cli
插件来管理本地资源了。希望这个示例对你有所帮助!