Flutter插件pivo的使用
Flutter插件pivo的使用
pivo
开发公司: Sports Visio, Inc
####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,
),
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 导入
pivo
插件。 - 创建一个Flutter应用,并在主页面中放置了一个
CustomRotationAnimation
小部件。 CustomRotationAnimation
是一个有状态的小部件,它使用AnimationController
和Tween
来创建一个从0到360度的旋转动画。- 使用假设的
Pivo
小部件,将动画应用于一个容器(该容器包含一个旋转箭头图标)。
请注意,由于pivo
是一个假设的插件,上述代码中的Pivo
小部件及其属性(如animation
)是基于假设的。在实际使用时,你需要查阅pivo
插件的官方文档来了解其实际提供的小部件和属性。
如果pivo
插件提供了其他自定义功能或属性,你可能需要根据官方文档进行相应的调整。