Flutter本地资源管理插件native_assets_cli的使用

Flutter本地资源管理插件native_assets_cli的使用

插件简介

native_assets_cli 是一个用于捆绑Dart包中的原生代码的CLI工具。它允许开发者将C/C++/Rust等编写的原生库与Dart或Flutter应用集成,并在构建过程中自动处理这些资源。

  • package:native_assets_cli
  • Coverage Status
  • pub package
  • package publisher

状态:实验性

请注意,此包目前处于实验阶段,发布在labs.dart.dev pub发行商下以征求反馈。对于labs.dart.dev发行商下的包,我们通常计划在经过一段时间的反馈和迭代后,将其升级为受支持的发行商(如dart.dev, tools.dart.dev),或者停止该包。这些包的API和破坏性变化的预期率要高得多。您的反馈对我们改进这个包非常重要,有关bug请在bug tracker中提交问题;对于关于Dart和Flutter中本地资产功能的一般反馈和建议,请评论在dart-lang#50565flutter#129757

示例项目结构

一个典型的包含本地代码的包布局如下:

  • lib/ 包含使用dart:ffipackage: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#50565flutter#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

1 回复

更多关于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开始。

注意事项

  1. 资源路径:确保在Flutter代码中引用的资源路径与你在native_assets_cli命令中指定的源文件夹结构相匹配。
  2. 插件版本:检查native_assets_cli插件的最新版本和文档,以确保所有命令和配置都是最新的。
  3. 清理和重建:在修改了资源或运行了native_assets_cli命令后,建议清理并重建你的项目,以确保所有更改都已生效。

通过以上步骤,你就可以在Flutter项目中使用native_assets_cli插件来管理本地资源了。希望这个示例对你有所帮助!

回到顶部