sport_wear_select_view.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import 'dart:async';
  2. import 'dart:collection';
  3. import 'package:flutter/material.dart';
  4. import 'package:get/get.dart';
  5. import 'package:trackoffical_app/service/sport_wear.dart';
  6. import 'package:sensor/sensor.dart';
  7. Future<void> showSportWearSelectDialog() async{
  8. Get.put(SportWearSelectController());
  9. SportWearService service = Get.find();
  10. await service.scanStart();
  11. final SportWear? sw = await Get.dialog(const SportWearSelectView());
  12. await service.scanStop();
  13. if(sw != null){
  14. final old = service.connectedSportWear.value;
  15. // if(old != null){
  16. // await service.disconnect(old);
  17. // }
  18. await service.disconnect(SportWear());
  19. await service.connect(sw);
  20. }
  21. }
  22. class SportWearSelectController extends GetxController{
  23. final list =<SportWear>[].obs;
  24. final listMap = HashMap<String, SportWear>();
  25. StreamSubscription<List<SportWear>>? _subscription;
  26. @override
  27. void onReady() {
  28. super.onReady();
  29. SportWearService service = Get.find();
  30. _subscription = service.sportWearScanResult.listen((d) {
  31. final newList = <SportWear>[];
  32. for(var one in d){
  33. if(! listMap.containsKey(one.address)){
  34. listMap[one.address] = one;
  35. newList.add(one);
  36. }
  37. }
  38. list.addAll(newList);
  39. });
  40. }
  41. @override
  42. void onClose() {
  43. super.onClose();
  44. _subscription?.cancel();
  45. }
  46. }
  47. class SportWearSelectView extends GetView<SportWearSelectController>{
  48. const SportWearSelectView({super.key});
  49. @override
  50. Widget build(BuildContext context) {
  51. return Container(
  52. margin: const EdgeInsets.fromLTRB(20, 120, 20, 120),
  53. padding: const EdgeInsets.all(20),
  54. decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(12)),
  55. child: Column(
  56. children: [
  57. Text('选择心率带', style: context.textTheme.titleLarge),
  58. const SizedBox(height: 12),
  59. Obx(() => Column(
  60. children: controller.list.map((element) => _ElemRow(element, (){
  61. Get.back(result: element);
  62. })).toList(),
  63. ) )
  64. ],
  65. ),
  66. ) ;
  67. }
  68. }
  69. class _ElemRow extends StatelessWidget{
  70. final SportWear data;
  71. final VoidCallback onClick;
  72. const _ElemRow(this.data, this.onClick);
  73. @override
  74. Widget build(BuildContext context) {
  75. final style = context.textTheme.bodyLarge;
  76. return TextButton(onPressed: onClick, child: Row(
  77. mainAxisAlignment: MainAxisAlignment.center,
  78. children: [
  79. Text(data.name, style: style),
  80. ],
  81. )) ;
  82. }
  83. }