Flutter Spine客户端通信插件spine_client的使用

Flutter Spine客户端通信插件spine_client的使用

Spine Dart客户端库

Dart语言编写的Spine应用客户端库。它提供了发送领域命令和查询实体状态的功能。

访问 Pub包注册表 获取最新版本的包。

该包提供了以下功能:

  • Dart客户端库;
  • 生成的Protobuf Dart类型:
    • 标准类型(google.protobufgoogle.protobuf.plugin);
    • 必需的Spine类型(来自basetimecoreclientwebfirebase-web)。

该包不包含Protobuf源文件或描述符集。请参考相应的Maven工件获取这些文件。

使用

前提条件

使用此库的用户需要使用Spine Protobuf Dart插件

为了将Protobuf编译为Dart,需要执行以下步骤:

  1. 激活protoc_plugin Pub包:pub activate global protoc_plugin
  2. 应用Proto Dart插件:
    buildscript {
        classpath "io.spine.tools:spine-proto-dart-plugin:$spineVersion"
    }
    
    apply plugin: 'io.spine.tools.proto-dart-plugin'
    

Proto编译器插件会生成.pb.dart文件。Spine Proto Dart插件配置了Proto编译器插件。默认情况下,.pb.dart文件会在lib目录下生成,用于main范围,在test目录下生成,用于test范围。

Spine Proto Dart插件还会生成一个types.dart文件——类型注册文件。该类型注册文件用于满足spine_client包的反射需求。

示例

下面的示例演示了如何使用客户端库执行简单的查询并发布一组命令。

// 导入`spine_client`和辅助库。
import 'package:spine_client/spine_client.dart';
import 'package:spine_client/web_firebase_client.dart';
import 'package:spine_client/time.dart';

// 导入Firebase客户端库。
import 'package:firebase/firebase.dart' as fb;

// 导入从Protobuf生成的模型类型。
import 'example/acme/task/commands.pb.dart';
import 'example/acme/task/view.pb.dart';

// 导入包含所有模型类型的类型注册文件。
// 由Spine Proto Dart Gradle插件生成。
import 'types.dart' as exampleTypes;

void main() {
    var actorId = UserId()
            ..value = '$myUserId'; // 假设$myUserId是一个有效的用户ID
    var requests = ActorRequestFactory(actorId);
    var firebase = RestClient(
            fb.Database.getInstance(myFirebaseDbJsObject()), // 假设myFirebaseDbJsObject()返回一个有效的Firebase数据库实例
            'https://example-org-42.firebaseio.com' // 替换为实际的Firebase数据库URL
    );
    var client = BackendClient('https://example.org', // 替换为实际的后端服务URL
                               firebase,
                               typeRegistries: [myTypes.types()]); // 假设myTypes.types()返回类型注册列表

    // 查询所有的`TaskView`投影,并将所有任务标记为完成。
    client.fetch(requests.query().all(TaskView()))
          .forEach((taskView) {
              var markDone = MarkTaskDone()
                      ..id = taskView.id
                      ..who_completed = actorId;
              client.post(requests.command().create(markDone));
          });
}

维护

本地发布

该包由Travis CI在合并拉取请求时发布。

如果需要从本地机器发布该包,可以按照以下步骤操作:

  1. client-dart/build.gradle中更改publicationDir的值为计算机上的某个位置,但要确保该位置在项目目录之外;
  2. 运行./gradlew stagePubPublication
  3. 在选定的目录中运行pub publish并按照指示操作;
  4. 不要忘记撤销对client-dart/build.gradle的更改。

注意:为了能够执行上述操作,你必须是该包的上传者

添加上传者

作为上传者,你可以通过运行以下命令添加其他上传者:

pub uploader --package spine_client add <email>

删除上传者

作为上传者,你可以通过运行以下命令删除其他上传者:

pub uploader --package spine_client remove <email>

更多关于Flutter Spine客户端通信插件spine_client的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Spine客户端通信插件spine_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


spine_client 是一个用于在 Flutter 应用中与 Spine 服务器进行通信的插件。Spine 是一个用于构建游戏和应用的高性能 2D 动画工具,而 spine_client 插件则允许你在 Flutter 应用中加载和渲染 Spine 动画,并与服务器进行交互。

以下是使用 spine_client 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 spine_client 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  spine_client: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 创建 Spine 客户端

在 Flutter 应用中创建一个 SpineClient 实例来与 Spine 服务器进行通信。

import 'package:spine_client/spine_client.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 创建 Spine 客户端
  final spineClient = SpineClient();

  // 连接到 Spine 服务器
  await spineClient.connect('ws://your-spine-server-url');

  runApp(MyApp(spineClient: spineClient));
}

class MyApp extends StatelessWidget {
  final SpineClient spineClient;

  MyApp({required this.spineClient});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Spine Client Example'),
        ),
        body: SpineAnimationWidget(spineClient: spineClient),
      ),
    );
  }
}

3. 加载和渲染 Spine 动画

使用 SpineAnimationWidget 来加载和渲染 Spine 动画。

class SpineAnimationWidget extends StatefulWidget {
  final SpineClient spineClient;

  SpineAnimationWidget({required this.spineClient});

  @override
  _SpineAnimationWidgetState createState() => _SpineAnimationWidgetState();
}

class _SpineAnimationWidgetState extends State<SpineAnimationWidget> {
  SpineAnimation? _spineAnimation;

  @override
  void initState() {
    super.initState();

    // 加载 Spine 动画
    widget.spineClient.loadAnimation('path/to/spine-animation.json').then((animation) {
      setState(() {
        _spineAnimation = animation;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    if (_spineAnimation == null) {
      return Center(child: CircularProgressIndicator());
    }

    return SpineAnimationView(animation: _spineAnimation!);
  }
}

4. 与服务器进行交互

你可以使用 SpineClient 来发送和接收消息,与服务器进行交互。

// 发送消息到服务器
widget.spineClient.sendMessage('Hello, Spine Server!');

// 监听来自服务器的消息
widget.spineClient.onMessageReceived.listen((message) {
  print('Received message from server: $message');
});

5. 断开连接

在应用退出或不再需要连接时,记得断开与服务器的连接。

@override
void dispose() {
  widget.spineClient.disconnect();
  super.dispose();
}

6. 处理错误

处理可能出现的连接错误或动画加载错误。

widget.spineClient.onError.listen((error) {
  print('Error occurred: $error');
});

7. 自定义动画控制

你可以通过 SpineAnimation 对象来控制动画的播放、暂停、停止等操作。

_spineAnimation?.play('run');
_spineAnimation?.pause();
_spineAnimation?.stop();

8. 调试和优化

在开发过程中,你可以启用调试模式来查看详细的日志信息,以便更好地调试和优化你的应用。

spineClient.enableDebugLogging(true);
回到顶部