264 lines
8.3 KiB
Dart
264 lines
8.3 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
|
|
import '../../common/EventBusUtil.dart';
|
|
import '../../common/Global.dart';
|
|
import '../../common/func.dart';
|
|
import '../../dialog/bt_description_dialog.dart';
|
|
import '../../network/NetworkConfig.dart';
|
|
|
|
class BtGamePadPage extends StatefulWidget {
|
|
const BtGamePadPage({super.key});
|
|
|
|
@override
|
|
State<BtGamePadPage> createState() => _BtGamePadPageState();
|
|
}
|
|
|
|
class _BtGamePadPageState extends State<BtGamePadPage> {
|
|
late StreamSubscription<RefreshBtState> _refreshBtStateEvent;
|
|
|
|
int currentBtIndex = -1;
|
|
|
|
@override
|
|
void initState() {
|
|
// TODO: implement initState
|
|
super.initState();
|
|
|
|
///刷新用户信息
|
|
_refreshBtStateEvent = EventBusUtil.listen((event) {
|
|
setState(() {});
|
|
});
|
|
|
|
//蓝牙已打开,获取蓝牙设备列表
|
|
if (NetworkConfig.isBtOpen) {
|
|
Map<String, dynamic> gameMap = {
|
|
"getBtListDevices": "getBtListDevices",
|
|
};
|
|
|
|
///传值初始化游戏token
|
|
invokeNativeMethod("getBtListDevices", gameMap);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
// TODO: implement dispose
|
|
super.dispose();
|
|
_refreshBtStateEvent.cancel();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final size = MediaQuery.of(context).size;
|
|
final h50 = size.width / 7.2;
|
|
final s16 = size.width / 22.5;
|
|
final l14 = size.width / 25.71428571428571;
|
|
final w19 = size.width / 18.94736842105263;
|
|
final h26 = size.width / 13.84615384615385;
|
|
final w33 = size.width / 10.909090909090;
|
|
final h18 = size.width / 20;
|
|
final t20 = size.width / 18;
|
|
final s13 = size.width / 27.692307692307;
|
|
final w223 = size.width / 1.6143497757847;
|
|
final h44 = size.width / 8.1818181818181;
|
|
final w40 = size.width / 9;
|
|
|
|
return Scaffold(
|
|
backgroundColor: const Color(0xFF17181A),
|
|
body: Column(
|
|
children: [
|
|
Container(
|
|
width: size.width,
|
|
height: h50,
|
|
margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
|
|
child: Stack(
|
|
alignment: Alignment.center,
|
|
children: [
|
|
Text(
|
|
"蓝牙手柄",
|
|
style: TextStyle(fontSize: s16, color: Color(0xFFD6D6D7)),
|
|
),
|
|
Positioned(
|
|
left: l14,
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
Navigator.pop(context);
|
|
},
|
|
child: Image(
|
|
width: w19,
|
|
height: h26,
|
|
image: const AssetImage('assets/images/btn_fanhui.png'),
|
|
),
|
|
),
|
|
),
|
|
Positioned(
|
|
right: l14,
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
FunctionUtil.popDialog(context, BtDescriptionDialog());
|
|
},
|
|
child: Image(
|
|
width: w19,
|
|
height: h26,
|
|
image: const AssetImage('assets/images/ic_describe.png'),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
margin: EdgeInsets.only(left: l14, right: l14, top: l14),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
"开启蓝牙",
|
|
style: TextStyle(fontSize: l14, color: Color(0xFFD6D6D7)),
|
|
),
|
|
GestureDetector(
|
|
onTap: () {
|
|
//蓝牙开关
|
|
Map<String, dynamic> gameMap = {
|
|
"setBtState": !NetworkConfig.isBtOpen,
|
|
};
|
|
invokeNativeMethod("setBt", gameMap);
|
|
},
|
|
child: Image(
|
|
width: w33,
|
|
height: h18,
|
|
image: AssetImage(NetworkConfig.isBtOpen ? 'assets/images/ic_bt_on.png' : 'assets/images/ic_bt_off.png'),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
margin: EdgeInsets.only(left: l14, right: l14, top: t20),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
"连接状态",
|
|
style: TextStyle(fontSize: l14, color: Color(0xFFD6D6D7)),
|
|
),
|
|
Text(
|
|
NetworkConfig.connectionStatus == 0
|
|
? "未连接"
|
|
: NetworkConfig.connectionStatus == 1
|
|
? "连接中"
|
|
: NetworkConfig.connectionStatus == 2
|
|
? "已连接"
|
|
: "正在断开连接",
|
|
style: TextStyle(fontSize: l14, color: NetworkConfig.connectionStatus == 2 ? Colors.green : Color(0xFFD6D6D7)),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
GestureDetector(
|
|
onTap: () {
|
|
if (NetworkConfig.connectionStatus == 2) {
|
|
//进入手柄界面
|
|
Map<String, dynamic> map = {
|
|
"enterGamePad": "enterGamePad",
|
|
};
|
|
invokeNativeMethod("enterGamePad", map);
|
|
} else {
|
|
EasyLoading.showToast("请先连接设备");
|
|
}
|
|
},
|
|
child: Container(
|
|
width: w223,
|
|
height: h44,
|
|
margin: EdgeInsets.only(top: t20),
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(color: Color(0xFF074CE7), borderRadius: BorderRadius.all(Radius.circular(22))),
|
|
child: Text(
|
|
"进入蓝牙手柄",
|
|
style: TextStyle(fontSize: l14, color: Colors.white),
|
|
),
|
|
),
|
|
),
|
|
Container(
|
|
margin: EdgeInsets.only(left: l14, right: l14, top: l14),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
"可用设备",
|
|
style: TextStyle(fontSize: l14, color: Color(0xFFD6D6D7)),
|
|
),
|
|
Image(
|
|
width: w33,
|
|
height: w33,
|
|
image: AssetImage('assets/images/ic_bt_refresh.png'),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
margin: EdgeInsets.only(left: l14, right: l14, top: l14),
|
|
child: ListView.builder(
|
|
padding: EdgeInsets.all(0),
|
|
itemCount: NetworkConfig.btDevices.length,
|
|
itemBuilder: (context, index) {
|
|
return _btItem(index, w40);
|
|
}),
|
|
))
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
_btItem(index, w40) {
|
|
return GestureDetector(
|
|
onTap: () {
|
|
NetworkConfig.connectionStatus = 0;
|
|
currentBtIndex = index;
|
|
//点击连接设备
|
|
Map<String, dynamic> gameMap = {
|
|
"deviceIndex": index,
|
|
};
|
|
invokeNativeMethod("connectedDevice", gameMap);
|
|
setState(() {});
|
|
},
|
|
child: Container(
|
|
margin: EdgeInsets.only(bottom: 10),
|
|
padding: EdgeInsets.all(5),
|
|
decoration: BoxDecoration(
|
|
color: currentBtIndex == index ? Color(0xFF202530) : Color(0x00FFFFFF),
|
|
borderRadius: BorderRadius.all(Radius.circular(5)),
|
|
),
|
|
child: Row(
|
|
children: [
|
|
Image(
|
|
width: w40,
|
|
height: w40,
|
|
image: AssetImage('assets/images/ic_bt_device.png'),
|
|
),
|
|
Container(
|
|
margin: EdgeInsets.only(left: 17),
|
|
child: Text(
|
|
"${NetworkConfig.btDevices[index]}",
|
|
style: TextStyle(color: Color(0xFFD6D6D7)),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
// 获取原生的值
|
|
invokeNativeMethod(String method, Map<String, dynamic> map) async {
|
|
dynamic args;
|
|
try {
|
|
args = await Global.method.invokeMethod(method, map);
|
|
} on PlatformException catch (e) {}
|
|
}
|
|
}
|