Flutter实时渲染插件terra_flutter_rt的使用

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

Flutter实时渲染插件terra_flutter_rt的使用

1. 整理后的内容中尽量给我提供关于“Flutter实时渲染插件terra_flutter_rt的使用”的完整示例demo

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

import 'package:terra_flutter_rt/terra_flutter_rt.dart';
import 'package:terra_flutter_rt/types.dart';
import 'package:terra_flutter_rt/ios_controller.dart';

import 'package:http/http.dart' as http;
import 'dart:convert';

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

void dataCallback(Update data) {
  print("Got data in app");
  print(data.ts);
  print(data.type.datatypeString);
  print(data.val);
  print(data.d);
}

void deviceCallback(Device d) async {
  print("Device found");
  print(d.deviceName;
  //print(d.deviceId;
  if (d.deviceName == "WHOop 4A0834169") {
    bool? connect = await TerraFlutterRt.connectDevice(d;
    print connect;
    const connection = Connection.ble;
    const datatypes = [DataType.heartRate];
    await TerraFlutterRt.startRealtimeToApp(
        connection, datatypes, dataCallback);
    // await TerraFlutterRt.startRealtimeToServer(
    //     connection, datatypes, websockettoken);

    // After 15 seconds stop streaming and disconnect
    await Future.delayed(Duration(seconds: 15));
    await TerraFlutterRt.stopRealtime(connection);
    await TerraFlutterRt.disconnect(connection);
  }
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

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

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    const apiKey = '';
    const devId = '';
    var headers = {'x-api-key': apiKey, 'dev-id': devId};
    const connection = Connection.ble;
    const datatypes = [DataType.heartRate];

    // Platform version - visual state confirmation
    String platformVersion;
    try {
      platformVersion =
          await TerraFlutterRt.platformVersion ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });

    // Initialise the library
    await TerraFlutterRt.init(devId, "reference_id_flutter");

    // Need to run this once only to register the device with Terra
    // sdk token (DO THIS IN YOUR BACKEND)
    var sdktoken = '';
    var sdkrequest = http.Request('POST', Uri.parse('https://api.tryterra.co/v2/auth/generateAuthToken'));
    sdkrequest.headers.addAll(headers);
    http.StreamedResponse sdkresponse = await sdkrequest.send();
    if (sdkresponse.statusCode == 200) {
      sdktoken = json.decode(await sdkresponse.stream.bytesToString())['token'];
    }

    await TerraFlutterRt.initConnection(sdktoken);

    // If streaming to websocket, need a websocket token
    var websockettoken = '';
    var userId = await TerraFlutterRt.getUserId();
    var websocketrequest = http.Request('POST', Uri.parse('https://ws.tryterra.co/auth/user?id=' + userId!));
    websocketrequest.headers.addAll(headers);
    http.StreamedResponse websocketresponse = await websocketrequest.send();
    if (websocketresponse.statusCode == 200) {
      websockettoken = json.decode(await websocketresponse.stream.bytesToString())['token'];
    }

    // For BLE or WearOS connection, pull scanning widget to select a device
    if (connection == Connection.ble ||
        connection == Connection.wearOs ||
        connection == Connection.ant ||
        connection == Connection.allDevices) {
      await TerraFlutterRt.startDeviceScan(connection);
    }

    // Start streaming either to server (using token) or locally (using callback)
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            // iOSScanView() is required since apple doesn't have context access
            children: [
              Text('Running on: $_platformVersion\n'),
              iOSScanView(),
            ],
          ),
        ),
      ),
    );
  }
}

2. 参考我提供的内容和示例代回答“Flutter实时渲染插件terra_flutter_rt的使用”对应的内容

### Flutter实时渲染插件terra_flutter_rt的使用

#### Getting Started

这个项目是一个用于开发Flutter插件包的起点,专门包含针对Android和/or iOS平台的具体实现代码。

要开始使用Flutter,请查看我们的在线文档,该文档提供了教程、示例、移动开发指南以及完整的API参考。

#### Using the package

Terra Real Time插件提供了通过回调函数直接在应用中流式传输数据的能力,或者通过WebSocket将数据流式传输到服务器。

在你的应用文件中导入插件:

```dart
import 'package:terra_flutter_rt/terra_flutter_rt.dart';
import 'package:terra_flutter_rt/types.dart';
import 'package:terra_flutter_rt/ios_controller.dart';

第一行是所有功能的导入。types 包含不同的数据类型(连接、请求的数据类型和 接收数据类型)。iOS controller 是用于iOS扫描控制器UI。

每次你的应用打开时,都需要初始化库:

await TerraFlutterRt.init(devId, "reference_id");

第一次使用插件时,你需要使用initConnection注册设备与Terra进行通信。你可以从这里生成一个SDK令牌,使用你的Terra开发者凭据:

await TerraFlutterRt.initConnection(sdktoken);

然后获取用户ID:

const userId = await TerraFlutterRt.getUserId();

支持的可连接设备类型如下:

enum Connection { ble, apple, wearOs, android, ant }

支持的流式传输数据类型如下:

enum DataType { heartRate, ecg, steps, hrv, calories, location, speed, distance, stepsCadence, floorsClimbed, gyroscope, acceleration }

以下是一个使用连接和 数据类型的示例:

const connection = Connection.ble;
const datatypes = [DataType.heartRate];

对于BLE连接和ANT+,你可以拉取一个扫描界面让用户选择一个设备:

if (connection == Connection.ble ||
    connection == Connection.wearOs ||
    connection == Connection.ant ||
    connection == Connection.allDevices) {
  await TerraFlutterRt.startDeviceScan(connection);
}

可以可选地缓存设备。如果设置为true,此选项将在找到缓存的设备时不会拉取扫描屏幕:

await TerraFlutterRt.startDeviceScan(connection, useCache: true);

设置设备和数据类型后,你就可以开始流式传输了。要本地流式传输到应用,你可以传递一个回调函数,当接收到数据时会触发该函数:

void dataCallback(Update data) {
  print("Got data in app");
  print(data.ts);
  print(data.type.datatypeString);
  print(data.val);
  print(data.d);
}

// .......
await TerraFlutterRt.startRealtimeToApp(connection, datatypes, dataCallback);

以下是示例payloads:

{
  "val": 86,
  "type": "HEART_RATE",
  "ts": "22-10-24T09:15:25Z"
}

{
  "d": [1.373291015625E-4, -3.967225515625E-4, -1.068115234375E-4],
  "ts": "22-10-24t09:20:27.985Z",
  "type": "GYROSCOPE"
}

要通过WebSocket将数据流式传输到服务器,你需要从这里生成一个WebSocket令牌:

await TerraFlutterRt.startRealtimeToServer(connection, datatypes, websockettoken);

以下是示例payloads:


更多关于Flutter实时渲染插件terra_flutter_rt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时渲染插件terra_flutter_rt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用terra_flutter_rt插件进行实时渲染的示例代码。这个插件假设是用于某种形式的3D渲染或图形渲染。由于terra_flutter_rt是一个具体的第三方库,具体的API和功能可能会有所不同,因此以下代码是基于一般假设编写的。你需要根据terra_flutter_rt的官方文档进行调整。

首先,确保你已经在pubspec.yaml文件中添加了terra_flutter_rt依赖:

dependencies:
  flutter:
    sdk: flutter
  terra_flutter_rt: ^最新版本号  # 替换为实际版本号

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

接下来,在你的Flutter项目中,你可以创建一个新的Dart文件(例如main.dart)并编写以下代码来初始化和使用terra_flutter_rt进行实时渲染:

import 'package:flutter/material.dart';
import 'package:terra_flutter_rt/terra_flutter_rt.dart'; // 假设这是插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Terra Flutter RT Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TerraFlutterRtDemo(),
    );
  }
}

class TerraFlutterRtDemo extends StatefulWidget {
  @override
  _TerraFlutterRtDemoState createState() => _TerraFlutterRtDemoState();
}

class _TerraFlutterRtDemoState extends State<TerraFlutterRtDemo> {
  // 假设TerraRenderer是插件提供的用于渲染的类
  TerraRenderer? _renderer;

  @override
  void initState() {
    super.initState();
    // 初始化渲染器
    _renderer = TerraRenderer();
    // 设置渲染器的初始化参数,如场景、摄像机等
    _renderer?.initialize({
      // 假设这是初始化参数
      'scene': {
        'objects': [
          // 添加一些3D对象到场景中
          {
            'type': 'cube',
            'position': [0.0, 0.0, 0.0],
            'color': [1.0, 0.0, 0.0], // 红色
          },
        ],
      },
      'camera': {
        'position': [0.0, 0.0, 5.0],
        'lookAt': [0.0, 0.0, 0.0],
      },
    });
  }

  @override
  void dispose() {
    // 释放渲染器资源
    _renderer?.dispose();
    _renderer = null;
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Terra Flutter RT Demo'),
      ),
      body: Center(
        child: CustomPaint(
          size: Size(double.infinity, double.infinity),
          painter: _TerraFlutterRTPainter(_renderer!),
        ),
      ),
    );
  }
}

// 自定义Painter用于绘制渲染内容
class _TerraFlutterRTPainter extends CustomPainter {
  final TerraRenderer _renderer;

  _TerraFlutterRTPainter(this._renderer);

  @override
  void paint(Canvas canvas, Size size) {
    // 假设_renderer有一个render方法,它接受一个Canvas参数
    _renderer.render(canvas, size);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    // 假设我们总是需要重绘
    return true;
  }
}

请注意,上面的代码是一个简化的示例,并假设TerraRenderer是插件中提供的一个类,它有一个initialize方法来设置初始参数,以及一个render方法来在Canvas上绘制内容。实际上,terra_flutter_rt的具体API可能会有所不同,因此你需要参考该插件的官方文档来了解如何正确初始化和使用它。

此外,对于实时渲染,你可能还需要考虑在_TerraFlutterRtDemoState中设置一个定时器来不断更新渲染内容,以实现动画效果。这通常涉及到在initState中启动一个Ticker或在Widgetbuild方法中使用AnimationController等。但具体的实现细节将取决于terra_flutter_rt插件提供的API和功能。

回到顶部