Flutter命令行工具插件candid_dart_cli的使用

Flutter命令行工具插件candid_dart_cli的使用

pub,dev package publisher MIT

提供一个命令行工具来处理.did文件,并快速生成与.did文件对应的Dart代码。

生成的代码包括:

  • IDL
  • Service及其相关方法
  • 对应于.did文件的对象及其相关方法

生成的代码依赖于 agent_dart

快速开始

安装CLI

dart pub global activate candid_dart_cli

运行CLI

did2dart -d ./ -r

CLI选项

-p, --path                           指定`.did`文件的路径。
-i, --inject-packages                将带有设置的包导入到每个生成的Dart文件中。
-b, --pre-actor-call                 在调用Actor方法之前注入一段代码,可以引用请求参数`request`和类型为CanisterActor的参数`actor`。
-a, --post-actor-call                在调用Actor方法之后注入一段代码,可以引用请求参数`request`,类型为CanisterActor的参数`actor`,以及方法的返回结果`response`。
-d, --dir                            指定`.did`文件所在的目录。
-r, --recursive                      是否递归搜索`.did`文件,只有在指定目录时才有效。
-f, --freezed                        是否使用`Freezed`。
-e, --equal                          是否生成`equals`和`hashCode`方法。
                                     (默认启用)
-c, --copy-with                      是否生成`copyWith`方法。
                                     (默认启用)
-u, --make-collections-unmodifiable  是否使集合字段不可修改,只有在启用`Freezed`时才有效。
                                     (默认启用)
-h, --help                           查看帮助选项。

许可证

MIT License

版权所有 (c) 2022 AstroxNetwork

特此免费获得一份本软件的副本,以及随附的文档文件("软件"),以供任何目的使用,包括但不限于分发、复制、修改、合并、发布、分发、再许可和/或销售该软件的副本,并允许向其提供软件的人使用、复制、修改、合并、发布、分发、再许可和/或销售该软件。

以上版权声明和本许可声明必须包含在所有副本或实质性部分的软件中。

软件按"原样"提供,没有任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权的保证。在任何情况下,作者或版权持有者都不应对因软件或软件的使用或其他交易而引起的任何索赔、损害或其他责任负责。

示例代码

假设我们有一个名为example.did的文件,内容如下:

service : example {
    add: (nat) -> ();
    get: () -> (nat);
}

我们可以使用candid_dart_cli生成相应的Dart代码:

did2dart -p ./example.did -d ./generated -r

这将在./generated目录下生成以下文件:

example.did.dart 文件内容:

// Generated by Candid Dart CLI

import 'package:agent_dart/agent_dart.dart';

class ExampleService {
  final Agent agent;

  ExampleService(this.agent);

  Future<void> add(int value) async {
    await agent.update('add', '(nat)', [value]);
  }

  Future<int> get() async {
    return (await agent.query('get', '()', [])) as int;
  }
}

class AddRequest {
  final int value;

  AddRequest({required this.value});

  Map<String, dynamic> toJson() => {'value': value};
}

class GetResponse {
  final int result;

  GetResponse(this.result);

  factory GetResponse.fromJson(Map<String, dynamic> json) =>
      GetResponse(json['result'] as int);
}

这样,我们就成功地使用candid_dart_cli生成了与example.did文件对应的Dart代码。


更多关于Flutter命令行工具插件candid_dart_cli的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter命令行工具插件candid_dart_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


candid_dart_cli 是一个用于生成 Dart 代码的 Flutter 命令行工具插件,它可以将 Candid 文件(Internet Computer 的接口描述语言)转换为 Dart 代码。这个工具对于开发基于 Internet Computer (IC) 的 Flutter 应用非常有用,因为它允许你直接从 Candid 文件生成 Dart 客户端代码,从而简化了与 IC 智能合约的交互过程。

安装 candid_dart_cli

首先,你需要在你的开发环境中安装 candid_dart_cli。你可以通过 Dart 的包管理工具 pub 来安装它。

  1. 全局安装:

    你可以全局安装 candid_dart_cli,这样你就可以在命令行中直接使用它。

    dart pub global activate candid_dart_cli
    
  2. 本地安装:

    如果你想在特定的项目中使用 candid_dart_cli,你可以将它添加到 pubspec.yaml 文件的 dev_dependencies 中:

    dev_dependencies:
      candid_dart_cli: ^1.0.0
    

    然后运行:

    dart pub get
    

使用 candid_dart_cli

安装完成后,你可以在命令行中使用 candid_dart_cli 来生成 Dart 代码。以下是基本的使用方法:

  1. 生成 Dart 代码:

    假设你有一个名为 canister.did 的 Candid 文件,你可以使用以下命令生成 Dart 代码:

    candid_dart_cli generate -i canister.did -o lib/canister.dart
    
    • -i: 指定输入的 Candid 文件路径。
    • -o: 指定生成的 Dart 文件路径。
  2. 查看帮助信息:

    如果你想查看 candid_dart_cli 的帮助信息,可以运行:

    candid_dart_cli --help
    

    这将显示所有可用的命令和选项。

示例

假设你有一个简单的 Candid 文件 canister.did,内容如下:

service : {
  greet: (text) -> (text);
}

你可以使用 candid_dart_cli 生成 Dart 代码:

candid_dart_cli generate -i canister.did -o lib/canister.dart

生成的 canister.dart 文件将包含与 Candid 服务接口对应的 Dart 代码,你可以直接在 Flutter 应用中使用这些代码来与 IC 智能合约进行交互。

集成到 Flutter 项目

生成的 Dart 代码可以很容易地集成到你的 Flutter 项目中。你可以将生成的 canister.dart 文件导入到你的 Flutter 项目中,并使用它来调用智能合约的方法。

例如:

import 'package:your_app/canister.dart';

void main() async {
  final canister = Canister();
  final response = await canister.greet('Hello, IC!');
  print(response); // 输出: Hello, IC!
}
回到顶部