Flutter协议生成插件proto_generator的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter协议生成插件proto_generator的使用

1. 整理后的内容中关于“Flutter协议生成插件proto_generator的使用”的完整示例demo

在使用proto_generator插件时,我们需要遵循以下步骤来将Dart类映射到Protocol Buffers消息。下面是一个完整的示例流程:

  1. 添加依赖项: 首先,在pubspec.yaml文件中添加必要的依赖项。

    dependencies:
      proto_annotations: latest
      proto_generator: latest
      build_runner: any
    
  2. 导入proto_annotations: 在需要映射的Dart类中导入proto_annotations包,并添加part 'your_file.g.dart';指令。

    import 'package:proto_annotations/proto_annotations.dart';
    
    part 'your_file.g.dart';
    
  3. 装饰类和字段: 使用[@proto](/user/proto)注解装饰类,并为每个要映射的字段使用@ProtoField(n)注解指定.proto文件中的字段编号。

    [@proto](/user/proto)
    class YourClass {
      const YourClass({
        required this.field1,
        required this.field2,
      });
    
      @ProtoField(1)
      final String field1;
    
      @ProtoField(2)
      final double field2;
    }
    
  4. 运行build_runner构建器: 运行build_runner命令以生成.proto文件。

    dart run build_runner build
    
  5. 编译protoc: 使用protoc命令编译.proto文件到.pb.dart.pbenum.dart.pbjson.dart文件。

    protoc --dart_out=grpc:lib/src/grpc -Ilib/proto ./lib/proto/your_file.proto
    
  6. 格式化.proto文件(可选): 可以使用clang-format工具格式化.proto文件。

    clang-format -i lib/proto/your_file.proto
    
  7. 检查错误并修复: 如果在生成的代码中出现错误,可能是因为.proto文件中缺少引用。确保在相应的Dart文件中添加了正确的导入。

    import 'package:proto_annotations/proto_annotations.dart';
    import 'package:proto_mapper_example/src/grpc/model.pb.dart';
    
  8. 配置build.yaml(可选): 如果需要自定义配置,可以创建一个build.yaml文件来设置不同的选项。

    targets:
      $default:
        builders:
          proto_generator:protoBuilder:
            options:
              useWellKnownWrappers: false
              useWellKnownDuration: false
              useWellKnownTimestamp: false
              useProtoFieldNamingConventions: true
              packageName: com.mycompany.myproject
              wellKnownDurationType: $Duration
              wellKnownTimestampType: $Timestamp
              defaultIntPrecision: int32
              outProtoPath: proto/model.proto
              decimalEncoding: binary,
              options:
                - go_package = "./stubs"
    
  9. 使用Google Well Known Types(可选): 如果需要使用Google Well Known Types,请在build.yaml中启用相关选项,并确保protobuf库已正确安装。

    protoc --dart_out=grpc:lib/src/grpc -Ilib/proto -I/usr/include /usr/include/google/protobuf/*.proto  ./lib/proto/your_file.proto
    
  10. 查看示例项目: 可以参考提供的示例项目来了解更详细的实现细节。

    Check out the complete example project at https://gitlab.com/dartaculous/dartaculous/-/tree/main/proto_mapper/example.


更多关于Flutter协议生成插件proto_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter协议生成插件proto_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用proto_generator插件来生成Protocol Buffers(简称Protobuf)代码的示例。这个示例将涵盖基本的设置、Protobuf文件的编写、以及如何使用proto_generator生成Dart代码。

1. 设置Flutter项目

首先,确保你的Flutter环境已经配置好。然后,创建一个新的Flutter项目(如果你还没有项目的话):

flutter create my_flutter_app
cd my_flutter_app

2. 添加依赖

pubspec.yaml文件中添加protobufproto_generator依赖:

dependencies:
  flutter:
    sdk: flutter
  protobuf: ^2.0.0  # 请检查最新版本号

dev_dependencies:
  build_runner: ^2.0.0  # 请检查最新版本号
  proto_generator: ^2.0.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

3. 创建Protobuf文件

在项目的根目录下创建一个protos文件夹,并在其中创建一个名为example.proto的文件:

// example.proto
syntax = "proto3";

package example;

message User {
  string name = 1;
  int32 age = 2;
}

4. 配置build.yaml

在项目根目录下创建或编辑build.yaml文件,添加以下内容来配置proto_generator

targets:
  $default:
    builders:
      proto_generator:protobuf:generate_from_templates:
        enabled: true
        options:
          generate_for:
            - protos/example.proto

这里指定了proto_generator应该为protos/example.proto文件生成代码。

5. 生成Dart代码

在项目根目录下运行以下命令来生成Dart代码:

flutter pub run build_runner build

如果一切顺利,proto_generator将在.dart_tool/build/generated/source/proto_generator目录下生成对应的Dart代码文件。通常,这些文件会被自动添加到你的项目中,并且你可以在代码中直接引用它们。

6. 使用生成的代码

生成的Dart代码通常包含用于序列化和反序列化Protobuf消息的类。以下是如何在你的Flutter应用中使用这些类的示例:

import 'package:my_flutter_app/generated/example/example.pb.dart'; // 路径可能需要根据实际生成的文件调整

void main() {
  // 创建一个User对象
  User user = User()
    ..name = 'Alice'
    ..age = 30;

  // 序列化User对象为List<int>
  List<int> userBytes = user.writeToBuffer();

  // 反序列化List<int>为User对象
  User deserializedUser = User.fromBuffer(userBytes);

  print('Name: ${deserializedUser.name}, Age: ${deserializedUser.age}');
}

注意:上面的import路径可能需要根据实际生成的文件路径进行调整。

总结

通过上述步骤,你已经成功地在Flutter项目中设置了proto_generator插件,并生成了Protobuf消息的Dart代码。你可以根据需要扩展Protobuf文件,并重新运行flutter pub run build_runner build来生成更新后的代码。

回到顶部