Flutter JSON-RPC代码生成插件json_rpc_codegen的使用

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

Flutter JSON-RPC代码生成插件json_rpc_codegen的使用

安装

作为构建包,你需要安装注解和 build_runner:

dependencies:
  json_rpc_codegen: ^latest

dev_dependencies:
  build_runner: ^latest
  json_rpc_codegen_builder: ^latest

使用

API 使用非常基础。你创建一个抽象的 Dart 类来描述接口,代码生成器会为你完成其余的工作。

import 'package:json_rpc_codegen/json_rpc_codegen.dart';

part 'my_class.g.dart';

enum Stage { all, pre, post }

@jsonRpc
abstract class _MyClass {
  void startServerTask({
    required int id,
    required String taskName,
    bool verbose = false,
    double? scale,
  });

  @clientDefaults
  double getProgress(int id, [Stage stage = Stage.all]);
}

这将为客户端和 服务器生成大量的代码。查看文档以了解如何控制哪些类会被生成。 默认情况下,以下内容将会被生成:

  • MyClassClientMixin: 一个 Mixin,它在 ClientBase 类上包含了接口的所有客户端实现。
  • MyClassServerMixin: 一个 Mixin,在 ServerBase 类上包含了接口的所有服务器实现。
  • MyClassClient: 一个使用 MyClassClientMixin 的的类,可以直接使用。
  • MyClassServer: 一个使用 MyClassServerMixin 的的类,可以直接使用。

在大多数情况下,你会直接使用 MyClassClientMyClassServer。 如果你想将多个接口组合成一个,或者如果你正在处理 Peer,你可以使用 mixins。

以下是生成后的代码示例:

class MyClassClient {
  void startServerTask({
    required int id,
    required String taskName,
    // 所有可选参数都是 nullable,因为默认值由服务器管理
    bool? verbose,
    double? scale,
  });

  // 非空方法变为等待结果的 Future
  Future<double> getProgress(
    int id, [
    // 客户端默认设置在客户端
    Stage stage = Stage.all,
  ]);
}

// 服务器是抽象的,因为你需要实现服务器方法的逻辑
abstract class MyClassServer {
  // 所有服务器方法使用 FutureOr 并且可以是同步或异步
  [@protected](/user/protected)
  FutureOr<void> startServerTask(
    int id,
    String taskName,
    // 服务器默认设置由实现决定
    bool verbose,
    double? scale,
  );

  [@protected](/user/protected)
  FutureOr<double> getProgress(
    int id,
    // 客户端默认设置在服务器
    Stage stage,
  );
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用json_rpc_codegen插件的代码示例。json_rpc_codegen是一个用于生成JSON-RPC请求和响应代码的Flutter插件,它可以大大简化JSON-RPC通信的处理过程。

首先,确保你的Flutter项目中已经添加了json_rpc_codegen依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.0.1  # 必要的依赖,因为json_rpc_codegen依赖于它
dev_dependencies:
  build_runner: ^2.0.4
  json_rpc_codegen: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,假设你有一个JSON-RPC服务器,它支持以下两个方法:

  1. sum:接受两个整数参数并返回它们的和。
  2. subtract:接受两个整数参数并返回它们的差。

你可以创建一个JSON文件来定义这些方法,例如rpc_methods.json

{
  "sum": {
    "params": [
      {"name": "intA", "type": "integer"},
      {"name": "intB", "type": "integer"}
    ],
    "result": "integer"
  },
  "subtract": {
    "params": [
      {"name": "intA", "type": "integer"},
      {"name": "intB", "type": "integer"}
    ],
    "result": "integer"
  }
}

然后,你需要创建一个Dart文件来生成请求和响应的代码。例如,创建一个名为rpc_api.dart的文件,并在其中添加以下内容:

import 'package:json_annotation/json_annotation.dart';
import 'package:json_rpc_2/json_rpc_2.dart';

part 'rpc_api.g.dart';

@JsonRpc(serviceUrl: 'http://your-json-rpc-server-url')
abstract class RpcApi {
  factory RpcApi() => _$RpcApiJsonClient();

  @JsonRpcMethod('sum')
  Future<int> sum(int intA, int intB);

  @JsonRpcMethod('subtract')
  Future<int> subtract(int intA, int intB);
}

注意,这里使用了@JsonRpc注解来指定JSON-RPC服务的URL,并使用@JsonRpcMethod注解来标记每个方法。

接下来,运行flutter pub run build_runner build命令来生成代码。这将生成一个rpc_api.g.dart文件,其中包含实际进行JSON-RPC通信的代码。

现在,你可以在你的Flutter应用中使用生成的RpcApi类来与JSON-RPC服务器进行通信。例如:

import 'package:flutter/material.dart';
import 'rpc_api.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  RpcApi? _rpcApi;
  String _result = '';

  @override
  void initState() {
    super.initState();
    _rpcApi = RpcApi();
    _fetchData();
  }

  Future<void> _fetchData() async {
    try {
      int sumResult = await _rpcApi!.sum(10, 5);
      int subtractResult = await _rpcApi!.subtract(10, 5);
      setState(() {
        _result = 'Sum: $sumResult, Subtract: $subtractResult';
      });
    } catch (e) {
      setState(() {
        _result = 'Error: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('JSON-RPC Example'),
        ),
        body: Center(
          child: Text(_result),
        ),
      ),
    );
  }
}

在这个示例中,我们在initState方法中初始化了RpcApi实例,并调用了sumsubtract方法。结果会显示在应用的中心位置。

请确保将serviceUrl替换为你的实际JSON-RPC服务器URL,并根据需要调整代码。这样,你就可以使用json_rpc_codegen插件来简化JSON-RPC通信的处理过程了。

回到顶部