Flutter插件pivo的使用

Flutter插件pivo的使用

pivo

Sports Visio, Inc

开发公司: Sports Visio, Inc


coverage


####Flutter插件pivo的使用方法

初始化插件
String? licenseKey;
if (Platform.isAndroid) {
  licenseKey =
      '{"owner":"Pivo","platform":"android","plan":"pro","appIdentifier":"app.pivo.android.prosdkdemo","createdAt":1587528360,"expiredAt":2524575600,"signature":"KqyuZmlt5rOQynORymSI+o2hMRwPdWUcU/LPBqZAQQUJybEBaL7+LlWdReAcfnNyafStKjw607s2Jf79T3Nbhq/jpvTD/upGga2BqJYTOiOsUGpZe/vjDgR3iMad0IOdmEf/68hdvo70w0AObZ9xufO5rjMTXc/sXY43kQ40/KS9UQfICUzLi1zgnJNF+C08n5fKuY7vzEOFB8P6Id0UTRFrPVDTkzTpze7aUtkF0pvJ/F+8FnRMP2r004sGVsGREJYnvAAPnV76yPzy4jsBAc4qVxTY508FwL/AwtNN5n1gJAdpS9D+0HkK1bvaxwWCBZ0Kk67uqFjXSaiOBrN5vQ=="}';
} else {
  licenseKey =
      '{"owner":"Pivo","platform":"ios","plan":"pro","appIdentifier":"app.pivo.ios.prosdkdemo","createdAt":1589928528,"expiredAt":2537535600,"signature":"QCnY1ShAHgBRnxfkeLNesDhogCj8PtFavbeqIK/hpq0+2U1vVByvJHzYYqyD9MsqWkuhorYETmB3bGLfhQzuf1C/IYVTg6STXBu5xJJxGbchGT/YcEmnyhHMXg6kkXUUNHYQGu45iuk11olX6aaxNhVY+UatMW9V4hcBjalNoVnbQiID/Mk4jVYFw/e+lB/JX0/ALhQJb1GwsATrEbnwY4F6YNLfPyQ7AAiuf9VDa0tmf0XpV6EiRNYcuqHWta9n8Wft78iG4bxKCV7zF7VmbVI9a1wlOOXrv6bGFl85NVjtSecnai+difBqNz0QXFfD6uXoJqU9orAtc9hrI4caGg=="}';
}

await PivoPlatform.instance.unlockWithLicenseKey(licenseKey);
连接到设备
final devicesStream = PivoPlatform.instance.scanResults;
await PivoPlatform.instance.startScan();

// 监听流
devicesStream.listen((event) async {
  await PivoPlatform.instance.stopScan();

  // 连接到设备
  unawaited(PivoPlatform.instance.connect(
    event.first.device,
  ));
});
控制Pivo设备
// 获取支持的速度
final supportedSpeedsInSeconds =
  await PivoPlatform.instance.getSupportedSpeedsInSecondsPerRound();

// 向右转90度,以最高速度转动
await PivoPlatform.instance.turnRight(90, supportedSpeedsInSeconds.first);

// 等待3秒
await Future.delayed(Duration(seconds: 3));

// 向左转90度,以最高速度转动
await PivoPlatform.instance.turnLeft(90, supportedSpeedsInSeconds.first);

// 等待3秒
await Future.delayed(Duration(seconds: 3));

// 持续向左转动,以最高速度转动
await PivoPlatform.instance
              .turnLeftContinuously(supportedSpeedsInSeconds.first);

await Future.delayed(Duration(seconds: 3));

// 停止设备
await PivoPlatform.instance.stop();

// 持续向右转动,以最高速度转动
await PivoPlatform.instance
              .turnRightContinuously(supportedSpeedsInSeconds.first);

await Future.delayed(Duration(seconds: 3));

// 停止设备
await PivoPlatform.instance.stop();
从设备断开连接
await PivoPlatform.instance.disconnect();

路线图

  • ❌ 实现Pivo Pro SDK的对象检测功能
  • ❌ 创建Pivo基本SDK的Flutter插件

维护者


示例代码

// Copyright (c) 2022, Sports Visio, Inc
// https://sportsvisio.com
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.

import 'dart:developer';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:pivo/pivo.dart';
import 'package:pivo_example/pivo_control_page.dart';
import 'package:pivo_example/pop_ups.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
      final permissions = await Permission.values.request();

      permissions.forEach((permission, status) {
        log('Permission $permission is $status');
      });

      String? licenseKey;
      if (Platform.isAndroid) {
        licenseKey =
            '{"owner":"Pivo","platform":"android","plan":"pro","appIdentifier":"app.pivo.android.prosdkdemo","createdAt":1587528360,"expiredAt":2524575600,"signature":"KqyuZmlt5rOQynORymSI+o2hMRwPdWUcU/LPBqZAQQUJybEBaL7+LlWdReAcfnNyafStKjw607s2Jf79T3Nbhq/jpvTD/upGga2BqJYTOiOsUGpZe/vjDgR3iMad0IOdmEf/68hdvo70w0AObZ9xufO5rjMTXc/sXY43kQ40/KS9UQfICUzLi1zgnJNF+C08n5fKuY7vzEOFB8P6Id0UTRFrPVDTkzTpze7aUtkF0pvJ/F+8FnRMP2r004sGVsGREJYnvAAPnV76yPzy4jsBAc4qVxTY508FwL/AwtNN5n1gJAdpS9D+0HkK1bvaxwWCBZ0Kk67uqFjXSaiOBrN5vQ=="}';
      } else {
        licenseKey =
            '{"owner":"Pivo","platform":"ios","plan":"pro","appIdentifier":"app.pivo.ios.prosdkdemo","createdAt":1589928528,"expiredAt":2537535600,"signature":"QCnY1ShAHgBRnxfkeLNesDhogCj8PtFavbeqIK/hpq0+2U1vVByvJHzYYqyD9MsqWkuhorYETmB3bGLfhQzuf1C/IYVTg6STXBu5xJJxGbchGT/YcEmnyhHMXg6kkXUUNHYQGu45iuk11olX6aaxNhVY+UatMW9V4hcBjalNoVnbQiID/Mk4jVYFw/e+lB/JX0/ALhQJb1GwsATrEbnwY4F6YNLfPyQ7AAiuf9VDa0tmf0XpV6EiRNYcuqHWta9n8Wft78iG4bxKCV7zF7VmbVI9a1wlOOXrv6bGFl85NVjtSecnai+difBqNz0QXFfD6uXoJqU9orAtc9hrI4caGg=="}';
      }

      await PivoPlatform.instance.unlockWithLicenseKey(licenseKey);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Pivo Example')),
      body: StreamBuilder(
        stream: PivoPlatform.instance.scanResults,
        builder: (context, snapshot) {
          final data = snapshot.data;
          if (!snapshot.hasData || data == null) {
            return const SizedBox.shrink();
          }

          return Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Expanded(
                child: ListView.builder(
                  itemCount: data.length,
                  itemBuilder: (context, index) {
                    final result = data[index];
                    return PivoDeviceTile(scanResult: result);
                  },
                ),
              ),
            ],
          );
        },
      ),
      floatingActionButton: StreamBuilder<bool>(
        stream: PivoPlatform.instance.isScanningStream,
        builder: (context, snapshot) {
          if (snapshot.data ?? false) {
            return FloatingActionButton(
              onPressed: PivoPlatform.instance.stopScan,
              backgroundColor: Colors.red,
              child: const Icon(Icons.stop),
            );
          }

          return FloatingActionButton(
            onPressed: PivoPlatform.instance.startScan,
            child: const Icon(Icons.search),
          );
        },
      ),
    );
  }
}

class PivoDeviceTile extends StatefulWidget {
  const PivoDeviceTile({
    required this.scanResult,
    super.key,
  });

  final PivoDevice scanResult;

  [@override](/user/override)
  State<PivoDeviceTile> createState() => _PivoDeviceTileState();
}

class _PivoDeviceTileState extends State<PivoDeviceTile> {
  String get name => widget.scanResult.name;
  String get address => widget.scanResult.address;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ListTile(
      title: Text(name),
      subtitle: Text(address),
      trailing: IconButton(
        icon: const Icon(Icons.bluetooth),
        onPressed: () async {
          final result = await LoadingPopUp<PivoConnectionStatusEvent>(
            () => PivoPlatform.instance.connect(widget.scanResult),
            'Connecting to $name.\nMac Address $address...',
          ).show(context);

          if (!mounted) return;

          if (result is! PivoConnectionStatusCompleteEvent) {
            await const FailureToConnectPopUp().show(context);
            return;
          }

          await Navigator.of(context).push(
            MaterialPageRoute<void>(
              builder: (context) => PivoControlPage(result),
            ),
          );
        },
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个基于假设性描述的Flutter自定义旋转动画插件pivo的使用示例。请注意,由于pivo是一个假设的插件,以下代码是基于插件可能提供的功能进行编写的,实际使用时需要根据pivo插件的官方文档进行调整。

首先,确保在pubspec.yaml文件中添加了对pivo插件的依赖(假设该插件已发布到pub.dev):

dependencies:
  flutter:
    sdk: flutter
  pivo: ^x.y.z  # 替换为实际版本号

然后,运行flutter pub get以获取插件。

接下来,我们编写一个使用pivo插件的示例代码。假设pivo插件提供了一个Pivo小部件,用于创建自定义旋转动画。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pivo Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Pivo Demo'),
        ),
        body: Center(
          child: CustomRotationAnimation(),
        ),
      ),
    );
  }
}

class CustomRotationAnimation extends StatefulWidget {
  @override
  _CustomRotationAnimationState createState() => _CustomRotationAnimationState();
}

class _CustomRotationAnimationState extends State<CustomRotationAnimation> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);

    _animation = Tween<double>(begin: 0.0, end: 360.0).animate(_controller);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Pivo(  // 假设Pivo是插件提供的小部件
      animation: _animation,
      child: Container(
        width: 100,
        height: 100,
        decoration: BoxDecoration(
          color: Colors.blue,
          shape: BoxShape.circle,
        ),
        child: Center(
          child: Icon(
            Icons.arrow_circle_right,
            color: Colors.white,
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 导入pivo插件。
  2. 创建一个Flutter应用,并在主页面中放置了一个CustomRotationAnimation小部件。
  3. CustomRotationAnimation是一个有状态的小部件,它使用AnimationControllerTween来创建一个从0到360度的旋转动画。
  4. 使用假设的Pivo小部件,将动画应用于一个容器(该容器包含一个旋转箭头图标)。

请注意,由于pivo是一个假设的插件,上述代码中的Pivo小部件及其属性(如animation)是基于假设的。在实际使用时,你需要查阅pivo插件的官方文档来了解其实际提供的小部件和属性。

如果pivo插件提供了其他自定义功能或属性,你可能需要根据官方文档进行相应的调整。

回到顶部