style: refactored ESenseConnectDialog into own Widget
This commit is contained in:
		
							parent
							
								
									36e859d2fe
								
							
						
					
					
						commit
						0178eb5ffc
					
				
							
								
								
									
										52
									
								
								lib/esense_connect_dialog.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								lib/esense_connect_dialog.dart
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | |||
| import 'package:flutter/material.dart'; | ||||
| 
 | ||||
| class ESenseConnectDialog extends StatefulWidget { | ||||
|   final void Function(String) connect; | ||||
|   final ValueNotifier<String> deviceStatus; | ||||
|   const ESenseConnectDialog( | ||||
|       {super.key, required this.deviceStatus, required this.connect}); | ||||
| 
 | ||||
|   @override | ||||
|   State<ESenseConnectDialog> createState() => _ESenseConnectDialogState(); | ||||
| } | ||||
| 
 | ||||
| class _ESenseConnectDialogState extends State<ESenseConnectDialog> { | ||||
|   String eSenseDeviceName = ''; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return AlertDialog( | ||||
|       title: const Text('Connect to ESense'), | ||||
|       content: Column(mainAxisSize: MainAxisSize.min, children: [ | ||||
|         TextField( | ||||
|           onChanged: (input) { | ||||
|             setState(() { | ||||
|               eSenseDeviceName = input; | ||||
|             }); | ||||
|           }, | ||||
|           decoration: InputDecoration( | ||||
|             border: OutlineInputBorder(), | ||||
|             hintText: 'eSense-xxxx', | ||||
|             labelText: 'Device name', | ||||
|           ), | ||||
|         ), | ||||
|         // Text(eSenseDeviceName), | ||||
|         ValueListenableBuilder( | ||||
|             valueListenable: widget.deviceStatus, | ||||
|             builder: (BuildContext context, String value, Widget? child) { | ||||
|               return Text(value); | ||||
|             }), | ||||
|       ]), | ||||
|       actions: <Widget>[ | ||||
|         TextButton( | ||||
|           onPressed: () => Navigator.pop(context, 'Cancel'), | ||||
|           child: const Text('Discard'), | ||||
|         ), | ||||
|         TextButton( | ||||
|           onPressed: () => widget.connect(eSenseDeviceName), | ||||
|           child: const Text('Connect'), | ||||
|         ), | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | @ -4,6 +4,7 @@ import 'package:esense_flutter/esense.dart'; | |||
| import 'package:file_picker/file_picker.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:permission_handler/permission_handler.dart'; | ||||
| import 'package:sense_the_rhythm/esense_connect_dialog.dart'; | ||||
| import 'package:shared_preferences/shared_preferences.dart'; | ||||
| 
 | ||||
| import 'level.dart'; | ||||
|  | @ -19,15 +20,17 @@ class _LevelSelectionState extends State<LevelSelection> { | |||
|   String? stepmaniaCoursesPath; | ||||
|   List<FileSystemEntity> stepmaniaCoursesFolders = []; | ||||
| 
 | ||||
|   ESenseManager? eSenseManager; | ||||
|   String _deviceStatus = ''; | ||||
|   String eSenseDeviceName = ''; | ||||
|   ESenseManager? eSenseManager; | ||||
|   ValueNotifier<String> _deviceStatus = ValueNotifier(''); | ||||
|   // String _deviceStatus = ''; | ||||
|   bool connected = false; | ||||
|   bool sampling = false; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     _listenToESense(); | ||||
|     loadFolderPath(); | ||||
|   } | ||||
| 
 | ||||
|  | @ -61,40 +64,42 @@ class _LevelSelectionState extends State<LevelSelection> { | |||
|         connected = false; | ||||
|         switch (event.type) { | ||||
|           case ConnectionType.connected: | ||||
|             _deviceStatus = 'connected'; | ||||
|             _deviceStatus.value = 'connected'; | ||||
|             connected = true; | ||||
|             break; | ||||
|           case ConnectionType.unknown: | ||||
|             _deviceStatus = 'unknown'; | ||||
|             _deviceStatus.value = 'unknown'; | ||||
|             break; | ||||
|           case ConnectionType.disconnected: | ||||
|             _deviceStatus = 'disconnected'; | ||||
|             _deviceStatus.value = 'disconnected'; | ||||
|             sampling = false; | ||||
|             break; | ||||
|           case ConnectionType.device_found: | ||||
|             _deviceStatus = 'device_found'; | ||||
|             _deviceStatus.value = 'device_found'; | ||||
|             break; | ||||
|           case ConnectionType.device_not_found: | ||||
|             _deviceStatus = 'device_not_found'; | ||||
|             _deviceStatus.value = 'device_not_found'; | ||||
|             break; | ||||
|         } | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   Future<void> _connectToESense() async { | ||||
|   Future<void> _connectToESense(String deviceName) async { | ||||
|     if (!connected) { | ||||
|       await _askForPermissions(); | ||||
|       print('Trying to connect to eSense device...'); | ||||
|       setState(() { | ||||
|         eSenseDeviceName = deviceName; | ||||
|       }); | ||||
|       print(eSenseDeviceName); | ||||
|       eSenseManager = ESenseManager(eSenseDeviceName); | ||||
|       connected = await eSenseManager!.connect(); | ||||
|       print('success!'); | ||||
| 
 | ||||
|       setState(() { | ||||
|         _deviceStatus = connected ? 'connecting...' : 'connection failed'; | ||||
|         _deviceStatus.value = connected ? 'connecting...' : 'connection failed'; | ||||
|       }); | ||||
|       _listenToESense(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  | @ -147,44 +152,15 @@ class _LevelSelectionState extends State<LevelSelection> { | |||
|         title: const Text('Sense the Rhythm'), | ||||
|         actions: [ | ||||
|           IconButton( | ||||
|               onPressed: () => showDialog<String>( | ||||
|               onPressed: () => showDialog( | ||||
|                     context: context, | ||||
|                     builder: (BuildContext context) { | ||||
|                       return AlertDialog( | ||||
|                         title: const Text('Connect to ESense'), | ||||
|                         content: StatefulBuilder(builder: | ||||
|                             (BuildContext context, StateSetter setState) { | ||||
|                           return Column( | ||||
|                               mainAxisSize: MainAxisSize.min, | ||||
|                               children: [ | ||||
|                                 TextField( | ||||
|                                   onChanged: (input) { | ||||
|                                     setState(() { | ||||
|                                       eSenseDeviceName = input; | ||||
|                       return ESenseConnectDialog( | ||||
|                         deviceStatus: _deviceStatus, | ||||
|                         connect: (String name) { | ||||
|                           _connectToESense(name); | ||||
|                         }); | ||||
|                     }, | ||||
|                                   decoration: InputDecoration( | ||||
|                                     border: OutlineInputBorder(), | ||||
|                                     hintText: 'eSense-xxxx', | ||||
|                                     labelText: 'Device name', | ||||
|                                   ), | ||||
|                                 ), | ||||
|                                 Text(eSenseDeviceName), | ||||
|                                 Text(_deviceStatus) | ||||
|                               ]); | ||||
|                         }), | ||||
|                         actions: <Widget>[ | ||||
|                           TextButton( | ||||
|                             onPressed: () => Navigator.pop(context, 'Cancel'), | ||||
|                             child: const Text('Discard'), | ||||
|                           ), | ||||
|                           TextButton( | ||||
|                             onPressed: () => _connectToESense(), | ||||
|                             child: const Text('Connect'), | ||||
|                           ), | ||||
|                         ], | ||||
|                       ); | ||||
|                     }, | ||||
|                   ), | ||||
|               icon: const Icon(Icons.bluetooth)) | ||||
|         ], | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue