Advertisement
NotSooFriendly94

my flutter app.

Apr 30th, 2024
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 41.26 KB | None | 0 0
  1. //host_page.dart:
  2.  
  3. import 'dart:convert';
  4.  
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter_moving_background/flutter_moving_background.dart';
  7. import 'package:task_app_es/meeting_list_screen.dart';
  8. import 'work_screen.dart';
  9. import 'login_page.dart';
  10. import 'meeting_list_screen.dart';
  11. import 'package:qr_flutter/qr_flutter.dart';
  12. import 'package:flutter_blue/flutter_blue.dart' as flutter_blue;
  13.  
  14. class HostPage extends StatefulWidget {
  15.   final String id;
  16.   final String username;
  17.   final String esEmail;
  18.   final String passCode;
  19.   final String deviceID;
  20.   final String jobs;
  21.   final String meetingName;
  22.  
  23.   const HostPage(
  24.       {super.key,
  25.       required this.id,
  26.       required this.username,
  27.       required this.esEmail,
  28.       required this.passCode,
  29.       required this.deviceID,
  30.       required this.meetingName,
  31.       required this.jobs});
  32.  
  33.   @override
  34.   _HostPageState createState() => _HostPageState();
  35. }
  36.  
  37.  
  38. class _HostPageState extends State<HostPage> {
  39.   bool _fadeInCompleted = false;
  40.   bool _attendMeetingActive = false;
  41.    final TextEditingController _pinController = TextEditingController();
  42.   bool _isSearching = false;
  43.   String _message = '';
  44.  
  45.   @override
  46.   void initState() {
  47.     super.initState();
  48.     print('ID: ${widget.id}');
  49.     print('Username: ${widget.username}');
  50.     print('ES_Email: ${widget.esEmail}');
  51.     print('Passcode: ${widget.passCode}');
  52.     print('Device ID passed over to HostPage: ${widget.deviceID}');
  53.     Future.delayed(const Duration(milliseconds: 1000), () {
  54.       _startFadeInAnimation();
  55.        // Call the method to initialize NFC
  56.     });
  57.   }
  58.  
  59.  
  60.  
  61.   @override
  62.   void dispose() {
  63.     super.dispose();
  64.   }
  65.  
  66.   void _loginback({required String deviceID}) {
  67.     Navigator.push(
  68.       context,
  69.       MaterialPageRoute(
  70.           builder: (context) => LoginPage(deviceID: widget.deviceID)),
  71.     );
  72.   }
  73.  
  74.   void _startFadeInAnimation() {
  75.     Future.delayed(const Duration(milliseconds: 1000), () {
  76.       setState(() {
  77.         _fadeInCompleted = true;
  78.       });
  79.     });
  80.   }
  81.  
  82.    void _searchForHost() async {
  83.   setState(() {
  84.     _isSearching = true;
  85.   });
  86.  
  87.   flutter_blue.FlutterBlue flutterBlue = flutter_blue.FlutterBlue.instance;
  88.  
  89.   flutterBlue.scanResults.listen((results) {
  90.     for (var result in results) {
  91.       if (result.device.name == 'Your Host Device Name') {
  92.         _connectToHost(result.device);
  93.         break;
  94.       }
  95.     }
  96.   });
  97.  
  98.   flutterBlue.startScan(timeout: Duration(seconds: 10));
  99. }
  100.  
  101. void _connectToHost(flutter_blue.BluetoothDevice device) async {
  102.   try {
  103.     await device.connect();
  104.     await _sendPayload(device);
  105.   } catch (e) {
  106.     print('Error connecting to host: $e');
  107.   }
  108. }
  109.  
  110. Future<void> _sendPayload(flutter_blue.BluetoothDevice device) async {
  111.   final pin = await _promptPin();
  112.   if (pin != null) {
  113.     // Send payload in JSON format
  114.     final userData = {
  115.       'id': int.parse(widget.id),
  116.       'username': widget.username,
  117.       'esEmail': widget.esEmail,
  118.     };
  119.     final payload = jsonEncode(userData);
  120.    
  121.     try {
  122.       // Connect to the device
  123.       await device.connect();
  124.  
  125.       // Discover services
  126.       List<flutter_blue.BluetoothService> services = await device.discoverServices();
  127.  
  128.       // Iterate through each service to find characteristics
  129.       for (var service in services) {
  130.         List<flutter_blue.BluetoothCharacteristic> characteristics = service.characteristics;
  131.  
  132.         // Iterate through each characteristic
  133.         for (var characteristic in characteristics) {
  134.           // Write the payload to the characteristic
  135.           await characteristic.write(utf8.encode(payload));
  136.  
  137.           // Notify the user of successful connection
  138.           setState(() {
  139.             _message = 'You have joined the meeting.';
  140.           });
  141.  
  142.           // Disconnect after sending payload
  143.           await device.disconnect();
  144.  
  145.           return; // Exit the method after successful operation
  146.         }
  147.       }
  148.  
  149.       // If no characteristic was found
  150.       print('No characteristic found.');
  151.     } catch (e) {
  152.       print('Error: $e');
  153.     }
  154.   } else {
  155.     print('PIN entry cancelled.');
  156.   }
  157. }
  158.  
  159. Future<String?> _promptPin() async {
  160.   String? pin;
  161.   await showDialog(
  162.     context: context,
  163.     builder: (BuildContext context) {
  164.       return AlertDialog(
  165.         title: Text('Enter PIN'),
  166.         content: TextField(
  167.           controller: _pinController,
  168.           keyboardType: TextInputType.number,
  169.           decoration: InputDecoration(labelText: 'PIN'),
  170.         ),
  171.         actions: <Widget>[
  172.           TextButton(
  173.             child: Text('Cancel'),
  174.             onPressed: () {
  175.               Navigator.of(context).pop();
  176.             },
  177.           ),
  178.           TextButton(
  179.             child: Text('OK'),
  180.             onPressed: () {
  181.               pin = _pinController.text;
  182.               Navigator.of(context).pop();
  183.             },
  184.           ),
  185.         ],
  186.       );
  187.     },
  188.   );
  189.   return pin;
  190. }
  191.  
  192.  
  193.   @override
  194.   Widget build(BuildContext context) {
  195.     return AnimatedOpacity(
  196.       opacity: _fadeInCompleted ? 1.0 : 0.0,
  197.       duration: const Duration(milliseconds: 1500),
  198.       child: Stack(
  199.         children: [
  200.           SizedBox(
  201.             width: MediaQuery.of(context).size.width,
  202.             height: MediaQuery.of(context).size.height,
  203.             child: const MovingBackground(
  204.               backgroundColor: Colors.transparent,
  205.               circles: [
  206.                 MovingCircle(
  207.                     color: Color.fromARGB(149, 39, 2, 102), blurSigma: 100),
  208.                 MovingCircle(
  209.                     color: Color.fromARGB(118, 217, 0, 255), blurSigma: 170),
  210.                 MovingCircle(
  211.                     color: Color.fromARGB(123, 150, 2, 214), blurSigma: 80),
  212.                 MovingCircle(
  213.                     color: Color.fromARGB(115, 84, 10, 105), blurSigma: 120),
  214.                 MovingCircle(
  215.                     color: Color.fromARGB(129, 213, 128, 255), blurSigma: 60),
  216.                 MovingCircle(
  217.                     color: Color.fromARGB(99, 255, 255, 255), blurSigma: 100),
  218.               ],
  219.             ),
  220.           ),
  221.           Center(
  222.             child: Container(
  223.               width: MediaQuery.of(context).size.width * 0.95,
  224.               height: MediaQuery.of(context).size.height * 0.95,
  225.               child: Column(
  226.                 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  227.                 crossAxisAlignment: CrossAxisAlignment.stretch,
  228.                 children: [
  229.                   Container(
  230.                     height: MediaQuery.of(context).size.height * 0.7,
  231.                     child: Column(
  232.                       mainAxisAlignment: MainAxisAlignment.center,
  233.                       children: [
  234.                         ElevatedButton(
  235.                           onPressed: () {
  236.                             Navigator.pushReplacement(
  237.                               context,
  238.                               MaterialPageRoute(
  239.                                 builder: (context) => WorkScreen(
  240.                                   id: widget.id,
  241.                                   username: widget.username,
  242.                                   esEmail: widget.esEmail,
  243.                                   passCode: widget.passCode,
  244.                                   deviceID: widget.deviceID,
  245.                                   meetingName: '',
  246.                                   jobs: '',
  247.                                 ),
  248.                               ),
  249.                             );
  250.                           },
  251.                           style: ElevatedButton.styleFrom(
  252.                             backgroundColor: const Color.fromARGB(118, 101, 31, 170),
  253.                             minimumSize: Size(
  254.                               double.infinity,
  255.                               MediaQuery.of(context).size.height * 0.35,
  256.                             ),
  257.                             shape: const RoundedRectangleBorder(
  258.                               borderRadius: BorderRadius.only(
  259.                                 topLeft: Radius.circular(20),
  260.                                 topRight: Radius.circular(20),
  261.                               ),
  262.                               side: BorderSide(
  263.                                 color: Color.fromARGB(194, 132, 0, 255),
  264.                                 width: 5.0,
  265.                               ),
  266.                             ),
  267.                           ),
  268.                           child: Column(
  269.                             children: [
  270.                               Icon(
  271.                                 Icons.perm_identity,
  272.                                 color: const Color.fromARGB(194, 132, 0, 255),
  273.                                 size: MediaQuery.of(context).size.width * 0.4,
  274.                               ),
  275.                               const SizedBox(height: 5),
  276.                               Text(
  277.                                 'Host a meeting',
  278.                                 style: TextStyle(
  279.                                   color: const Color.fromARGB(255, 132, 0, 255),
  280.                                   fontSize:
  281.                                       MediaQuery.of(context).size.width * 0.08,
  282.                                 ),
  283.                               ),
  284.                             ],
  285.                           ),
  286.                         ),
  287.                         const SizedBox(height: 5),
  288.                         ElevatedButton(
  289.                           onPressed: () {
  290.                             setState(() {
  291.                               _attendMeetingActive = !_attendMeetingActive;
  292.                               // Additional logic can be added here
  293.                             });
  294.                           },
  295.                           style: ElevatedButton.styleFrom(
  296.                             backgroundColor: _attendMeetingActive
  297.                                 ? const Color.fromARGB(169, 172, 89, 255)
  298.                                 : const Color.fromARGB(118, 101, 31, 170),
  299.                             minimumSize: Size(
  300.                               double.infinity,
  301.                               MediaQuery.of(context).size.height * 0.335,
  302.                             ),
  303.                             shape: RoundedRectangleBorder(
  304.                               borderRadius: BorderRadius.circular(0),
  305.                               side: const BorderSide(
  306.                                 color: Color.fromARGB(194, 132, 0, 255),
  307.                                 width: 5.0,
  308.                               ),
  309.                             ),
  310.                           ),
  311.                           child: Stack(
  312.                             children: [
  313.                               Align(
  314.                                 alignment: Alignment.center,
  315.                                 child: Column(
  316.                                   children: [
  317.                                     Icon(
  318.                                       Icons.group_add_rounded,
  319.                                       color: _attendMeetingActive
  320.                                           ? const Color.fromARGB(193, 255, 255, 255)
  321.                                           : const Color.fromARGB(194, 132, 0, 255),
  322.                                       size: MediaQuery.of(context).size.width *
  323.                                           0.339,
  324.                                     ),
  325.                                     SizedBox(
  326.                                         height: _attendMeetingActive ? 15 : 5),
  327.                                     Text(
  328.                                       _attendMeetingActive
  329.                                           ? ''
  330.                                           : 'Attend a meeting',
  331.                                       style: TextStyle(
  332.                                         color: _attendMeetingActive
  333.                                             ? const Color.fromARGB(193, 255, 255, 255)
  334.                                             : const Color.fromARGB(194, 132, 0, 255),
  335.                                         fontSize:
  336.                                             MediaQuery.of(context).size.width *
  337.                                                 0.08,
  338.                                       ),
  339.                                     ),
  340.                                   ],
  341.                                 ),
  342.                               ),
  343.                               Positioned.fill(
  344.                                 child: Visibility(
  345.                                   visible: _attendMeetingActive,
  346.                                   child: Row(
  347.                                     mainAxisAlignment:
  348.                                         MainAxisAlignment.spaceBetween,
  349.                                     crossAxisAlignment: CrossAxisAlignment.end,
  350.                                     children: [
  351.                                       ElevatedButton(
  352.                                         onPressed: () {
  353.                                           // Create a Map with the desired key-value pairs
  354.                                           Map<String, dynamic> userData = {
  355.                                             'id': int.parse(widget.id),
  356.                                             'username': widget.username,
  357.                                             'esEmail': widget.esEmail,
  358.                                           };
  359.  
  360.                                           // Encode the map to JSON format
  361.                                           String jsonData =
  362.                                               jsonEncode(userData);
  363.  
  364.                                               print(jsonData);
  365.  
  366.                                           showDialog(
  367.                                             context: context,
  368.                                             builder: (BuildContext context) {
  369.                                               return AlertDialog(
  370.                                                 backgroundColor: const Color.fromARGB(
  371.                                                     248, 0, 0, 0),
  372.                                                 contentPadding: EdgeInsets.zero,
  373.                                                 content: Container(
  374.                                                   width: MediaQuery.of(context)
  375.                                                           .size
  376.                                                           .width *
  377.                                                       0.99, // 80% of screen width
  378.                                                   height: MediaQuery.of(context)
  379.                                                           .size
  380.                                                           .height *
  381.                                                       0.4, // 90% of screen height
  382.                                                   child: Column(
  383.                                                     mainAxisAlignment:
  384.                                                         MainAxisAlignment
  385.                                                             .center,
  386.                                                     mainAxisSize:
  387.                                                         MainAxisSize.min,
  388.                                                     children: [
  389.                                                       Text(
  390.                                                         'SHOW TO HOST',
  391.                                                         style: TextStyle(
  392.                                                           fontSize: MediaQuery.of(
  393.                                                                       context)
  394.                                                                   .size
  395.                                                                   .width *
  396.                                                               0.055, // Adjust title size
  397.                                                           color: const Color.fromARGB(
  398.                                                               255,
  399.                                                               213,
  400.                                                               181,
  401.                                                               255),
  402.                                                         ),
  403.                                                       ),
  404.                                                       const SizedBox(height: 10),
  405.                                                       Container(
  406.                                                         width: 200,
  407.                                                         height: 200,
  408.                                                         child: QrImageView(
  409.                                                           data:
  410.                                                               jsonData, // Pass the JSON encoded data
  411.                                                           version:
  412.                                                               QrVersions.auto,
  413.                                                           gapless: true,
  414.                                                           eyeStyle: const QrEyeStyle(
  415.                                                               eyeShape:
  416.                                                                   QrEyeShape
  417.                                                                       .square,
  418.                                                               color: Color.fromARGB(255, 0, 0, 0)),
  419.                                                           dataModuleStyle:
  420.                                                               const QrDataModuleStyle(
  421.                                                                   color: Color.fromARGB(255, 0, 0, 0)),
  422.                                                           backgroundColor:
  423.                                                               Color.fromARGB(255, 255, 255, 255),
  424.                                                         ),
  425.                                                       ),
  426.                                                     ],
  427.                                                   ),
  428.                                                 ),
  429.                                                 actions: [
  430.                                                   Center(
  431.                                                     child: TextButton(
  432.                                                       onPressed: () {
  433.                                                         Navigator.of(context)
  434.                                                             .pop();
  435.                                                       },
  436.                                                       child: Text(
  437.                                                         'CLOSE',
  438.                                                         style: TextStyle(
  439.                                                           color: const Color.fromARGB(
  440.                                                               255,
  441.                                                               213,
  442.                                                               181,
  443.                                                               255),
  444.                                                           fontSize: MediaQuery.of(
  445.                                                                       context)
  446.                                                                   .size
  447.                                                                   .width *
  448.                                                               0.045,
  449.                                                         ),
  450.                                                       ),
  451.                                                     ),
  452.                                                   ),
  453.                                                 ],
  454.                                               );
  455.                                             },
  456.                                           );
  457.                                         },
  458.                                         style: ElevatedButton.styleFrom(
  459.                                           backgroundColor:
  460.                                               const Color.fromARGB(118, 101, 31, 170),
  461.                                           minimumSize: Size(
  462.                                             MediaQuery.of(context).size.width *
  463.                                                 0.4,
  464.                                             MediaQuery.of(context).size.height *
  465.                                                 0.04,
  466.                                           ),
  467.                                           shape: const RoundedRectangleBorder(
  468.                                             borderRadius: BorderRadius.only(
  469.                                                 topLeft: Radius.circular(20)),
  470.                                           ),
  471.                                           side: const BorderSide(
  472.                                             color: Color.fromARGB(
  473.                                                 194, 132, 0, 255),
  474.                                             width: 3.0,
  475.                                           ),
  476.                                         ),
  477.                                         child: const Text(
  478.                                           'QR Code',
  479.                                           style: TextStyle(
  480.                                               fontSize: 18,
  481.                                               color: Color.fromARGB(
  482.                                                   194, 255, 255, 255)),
  483.                                         ),
  484.                                       ),
  485.                                       ElevatedButton(
  486.                                         onPressed: () {
  487.                                         _searchForHost();
  488.                                         },
  489.                                         style: ElevatedButton.styleFrom(
  490.                                           backgroundColor:
  491.                                               const Color.fromARGB(118, 101, 31, 170),
  492.                                           minimumSize: Size(
  493.                                             MediaQuery.of(context).size.width *
  494.                                                 0.4,
  495.                                             MediaQuery.of(context).size.height *
  496.                                                 0.04,
  497.                                           ),
  498.                                           shape: const RoundedRectangleBorder(
  499.                                             borderRadius: BorderRadius.only(
  500.                                                 bottomRight:
  501.                                                     Radius.circular(20)),
  502.                                           ),
  503.                                           side: const BorderSide(
  504.                                             color: Color.fromARGB(
  505.                                                 194, 132, 0, 255),
  506.                                             width: 3.0,
  507.                                           ),
  508.                                         ),
  509.                                         child: const Text(
  510.                                           'Bluetooth',
  511.                                           style: TextStyle(
  512.                                               fontSize: 18,
  513.                                               color: Color.fromARGB(
  514.                                                   194, 255, 255, 255)),
  515.                                         ),
  516.                                       ),
  517.                                     ],
  518.                                   ),
  519.                                 ),
  520.                               ),
  521.                             ],
  522.                           ),
  523.                         ),
  524.                       ],
  525.                     ),
  526.                   ),
  527.                   Container(
  528.                     height: MediaQuery.of(context).size.height * 0.15,
  529.                     width: MediaQuery.of(context).size.width * 0.95,
  530.                     child: Row(
  531.                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
  532.                       children: [
  533.                         ElevatedButton(
  534.                           onPressed: () {
  535.                             Navigator.pushReplacement(
  536.                               context,
  537.                               MaterialPageRoute(
  538.                                 builder: (context) => MeetingListScreen(
  539.                                   id: widget.id,
  540.                                   username: widget.username,
  541.                                   esEmail: widget.esEmail,
  542.                                   passCode: widget.passCode,
  543.                                   deviceID: widget.deviceID,
  544.                                   meetingName: '',
  545.                                   jobs: '',
  546.                                 ),
  547.                               ),
  548.                             );
  549.                           },
  550.                           style: ElevatedButton.styleFrom(
  551.                             backgroundColor: const Color.fromARGB(118, 101, 31, 170),
  552.                             minimumSize: Size(
  553.                               MediaQuery.of(context).size.width * 0.313,
  554.                               double.infinity,
  555.                             ),
  556.                             padding: EdgeInsets.symmetric(
  557.                                 vertical:
  558.                                     MediaQuery.of(context).size.width * 0.04),
  559.                             shape: RoundedRectangleBorder(
  560.                               borderRadius: BorderRadius.circular(0),
  561.                               side: const BorderSide(
  562.                                 color: Color.fromARGB(194, 132, 0, 255),
  563.                                 width: 5.0,
  564.                               ),
  565.                             ),
  566.                           ),
  567.                           child: Column(
  568.                             children: [
  569.                               Icon(
  570.                                 Icons.app_shortcut_rounded,
  571.                                 color: const Color.fromARGB(194, 132, 0, 255),
  572.                                 size: MediaQuery.of(context).size.width * 0.12,
  573.                               ),
  574.                               const SizedBox(height: 5),
  575.                               Text(
  576.                                 'My Meetings',
  577.                                 style: TextStyle(
  578.                                   color: const Color.fromARGB(255, 132, 0, 255),
  579.                                   fontSize:
  580.                                       MediaQuery.of(context).size.width * 0.03,
  581.                                 ),
  582.                               ),
  583.                             ],
  584.                           ),
  585.                         ),
  586.                         ElevatedButton(
  587.                           onPressed: () {
  588.                             // Handle 'Collaborators' button press
  589.                           },
  590.                           style: ElevatedButton.styleFrom(
  591.                             backgroundColor: const Color.fromARGB(118, 101, 31, 170),
  592.                             minimumSize: Size(
  593.                               MediaQuery.of(context).size.width * 0.313,
  594.                               double.infinity,
  595.                             ),
  596.                             padding: EdgeInsets.symmetric(
  597.                                 vertical:
  598.                                     MediaQuery.of(context).size.width * 0.04),
  599.                             shape: RoundedRectangleBorder(
  600.                               borderRadius: BorderRadius.circular(0),
  601.                               side: const BorderSide(
  602.                                 color: Color.fromARGB(194, 132, 0, 255),
  603.                                 width: 5.0,
  604.                               ),
  605.                             ),
  606.                           ),
  607.                           child: Column(
  608.                             children: [
  609.                               Icon(
  610.                                 Icons.group_rounded,
  611.                                 color: const Color.fromARGB(194, 132, 0, 255),
  612.                                 size: MediaQuery.of(context).size.width * 0.12,
  613.                               ),
  614.                               const SizedBox(height: 5),
  615.                               Text(
  616.                                 'Collaborators',
  617.                                 style: TextStyle(
  618.                                   color: const Color.fromARGB(255, 132, 0, 255),
  619.                                   fontSize:
  620.                                       MediaQuery.of(context).size.width * 0.03,
  621.                                 ),
  622.                               ),
  623.                             ],
  624.                           ),
  625.                         ),
  626.                         ElevatedButton(
  627.                           onPressed: () {
  628.                             // Handle 'Options' button press
  629.                           },
  630.                           style: ElevatedButton.styleFrom(
  631.                             backgroundColor: const Color.fromARGB(118, 101, 31, 170),
  632.                             minimumSize: Size(
  633.                               MediaQuery.of(context).size.width * 0.313,
  634.                               double.infinity,
  635.                             ),
  636.                             padding: EdgeInsets.symmetric(
  637.                                 vertical:
  638.                                     MediaQuery.of(context).size.width * 0.04),
  639.                             shape: RoundedRectangleBorder(
  640.                               borderRadius: BorderRadius.circular(0),
  641.                               side: const BorderSide(
  642.                                 color: Color.fromARGB(194, 132, 0, 255),
  643.                                 width: 5.0,
  644.                               ),
  645.                             ),
  646.                           ),
  647.                           child: Column(
  648.                             children: [
  649.                               Icon(
  650.                                 Icons.settings,
  651.                                 color: const Color.fromARGB(194, 132, 0, 255),
  652.                                 size: MediaQuery.of(context).size.width * 0.12,
  653.                               ),
  654.                               const SizedBox(height: 5),
  655.                               Text(
  656.                                 'Options',
  657.                                 style: TextStyle(
  658.                                   color: const Color.fromARGB(255, 132, 0, 255),
  659.                                   fontSize:
  660.                                       MediaQuery.of(context).size.width * 0.03,
  661.                                 ),
  662.                               ),
  663.                             ],
  664.                           ),
  665.                         ),
  666.                       ],
  667.                     ),
  668.                   ),
  669.                   Container(
  670.                     child: ElevatedButton(
  671.                       onPressed: () {
  672.                         _loginback(deviceID: widget.deviceID);
  673.                       },
  674.                       style: ElevatedButton.styleFrom(
  675.                         backgroundColor: const Color.fromARGB(45, 255, 0, 21),
  676.                         minimumSize: Size(
  677.                           double.infinity,
  678.                           MediaQuery.of(context).size.height * 0.05,
  679.                         ),
  680.                         shape: const RoundedRectangleBorder(
  681.                           borderRadius: BorderRadius.only(
  682.                             bottomLeft: Radius.circular(20),
  683.                             bottomRight: Radius.circular(20),
  684.                           ),
  685.                         ),
  686.                         side: const BorderSide(
  687.                           color: Color.fromARGB(194, 132, 0, 255),
  688.                           width: 5.0,
  689.                         ),
  690.                       ),
  691.                       child: Text(
  692.                         'LOG OUT',
  693.                         style: TextStyle(
  694.                           color: const Color.fromARGB(115, 255, 58, 58),
  695.                           fontSize: MediaQuery.of(context).size.width * 0.06,
  696.                         ),
  697.                       ),
  698.                     ),
  699.                   ),
  700.                 ],
  701.               ),
  702.             ),
  703.           ),
  704.         ],
  705.       ),
  706.     );
  707.   }
  708. }
  709.  
  710.  
  711. ----------------------------------------------
  712.  
  713. //qr_scanner.dart:
  714.  
  715. import 'dart:async';
  716. import 'dart:convert';
  717. import 'package:flutter/material.dart';
  718. import 'package:flutter/services.dart';
  719. import 'package:flutter/widgets.dart';
  720. import 'dart:math';
  721. import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart' as barcode_scanner;
  722. import 'package:flutter_blue/flutter_blue.dart' as flutter_blue;
  723.  
  724. class BarcodeScannerWidget extends StatefulWidget {
  725.   @override
  726.   _BarcodeScannerWidgetState createState() => _BarcodeScannerWidgetState();
  727. }
  728.  
  729. class _BarcodeScannerWidgetState extends State<BarcodeScannerWidget> with WidgetsBindingObserver {
  730.   List<Map<String, dynamic>> _scannedDataList = [];
  731.   bool _acceptBluetooth = false;
  732.   String _randomPin = '';
  733.   bool _isScanningBluetooth = false;
  734.   flutter_blue.FlutterBlue flutterBlue = flutter_blue.FlutterBlue.instance;
  735.  
  736.   @override
  737.   void initState() {
  738.     super.initState();
  739.     WidgetsBinding.instance!.addObserver(this);
  740.     _generateRandomPin();
  741.   }
  742.  
  743.   @override
  744.   void dispose() {
  745.     WidgetsBinding.instance!.removeObserver(this);
  746.     _stopBluetoothScan();
  747.     super.dispose();
  748.   }
  749.  
  750.   @override
  751.   void didChangeAppLifecycleState(AppLifecycleState state) {
  752.     if (state == AppLifecycleState.paused) {
  753.       // Save data or perform other tasks when app is paused
  754.     }
  755.   }
  756.  
  757.   Future<void> scanQR() async {
  758.     try {
  759.       final qrScanRes = await barcode_scanner.FlutterBarcodeScanner.scanBarcode(
  760.         '#ff6666',
  761.         'Cancel',
  762.         true,
  763.         barcode_scanner.ScanMode.QR,
  764.       );
  765.       if (qrScanRes != '-1') {
  766.         final data = parseQRData(qrScanRes);
  767.         setState(() {
  768.           _scannedDataList.add(data);
  769.         });
  770.       }
  771.     } catch (e) {
  772.       print('Error scanning QR code: $e');
  773.     }
  774.   }
  775.  
  776.   Map<String, dynamic> parseQRData(String qrData) {
  777.     try {
  778.       return jsonDecode(qrData);
  779.     } catch (e) {
  780.       print('Error parsing QR data: $e');
  781.       return {};
  782.     }
  783.   }
  784.  
  785.   Color generateRandomColor(List<Color> previousColors) {
  786.     final random = Random();
  787.     Color color;
  788.     do {
  789.       final r = 180 + random.nextInt(76);
  790.       final g = 180 + random.nextInt(76);
  791.       final b = 180 + random.nextInt(76);
  792.       color = Color.fromRGBO(r, g, b, 0.7);
  793.     } while (previousColors.contains(color));
  794.     return color;
  795.   }
  796.  
  797.   void _generateRandomPin() {
  798.     final random = Random();
  799.     _randomPin = '${random.nextInt(10)}${random.nextInt(10)}${random.nextInt(10)}${random.nextInt(10)}';
  800.   }
  801.  
  802.   void simulateScan() {
  803.     final random = Random();
  804.     final id = random.nextInt(1000);
  805.     final username = 'Lewis.Whitehead';
  806.     final email = 'Lewis.whitehead@epilepsysociety.org.uk';
  807.     final data = {
  808.       'id': id,
  809.       'username': username,
  810.       'esEmail': email,
  811.     };
  812.     setState(() {
  813.       _scannedDataList.insert(0, data);
  814.     });
  815.   }
  816.  
  817.   void _startBluetoothScan() {
  818.     _isScanningBluetooth = true;
  819.     flutterBlue.scanResults.listen((results) {
  820.       for (var result in results) {
  821.         _connectToDevice(result.device);
  822.       }
  823.     });
  824.     flutterBlue.startScan(timeout: Duration(seconds: 10));
  825.   }
  826.  
  827.   void _stopBluetoothScan() {
  828.     _isScanningBluetooth = false;
  829.     flutterBlue.stopScan();
  830.   }
  831.  
  832.   void _connectToDevice(flutter_blue.BluetoothDevice device) async {
  833.     try {
  834.       await device.connect();
  835.       List<flutter_blue.BluetoothService> services = await device.discoverServices();
  836.       services.forEach((service) async {
  837.         List<flutter_blue.BluetoothCharacteristic> characteristics = service.characteristics;
  838.         for (var characteristic in characteristics) {
  839.           if (characteristic.uuid.toString() == 'Your PIN Characteristic UUID') {
  840.             List<int> pin = await characteristic.read();
  841.             if (utf8.decode(pin) == _randomPin) {
  842.               // Send payload if PIN is correct
  843.               await _sendData(characteristic);
  844.               break;
  845.             } else {
  846.               print('Incorrect PIN');
  847.             }
  848.           }
  849.         }
  850.       });
  851.     } catch (e) {
  852.       print('Error connecting to device: $e');
  853.     } finally {
  854.       await device.disconnect();
  855.     }
  856.   }
  857.  
  858.   Future<void> _sendData(flutter_blue.BluetoothCharacteristic characteristic) async {
  859.     try {
  860.       // Write payload data to the characteristic
  861.       await characteristic.write(utf8.encode('Your Payload Data'));
  862.     } catch (e) {
  863.       print('Error sending data: $e');
  864.     }
  865.   }
  866.  
  867.   @override
  868.   Widget build(BuildContext context) {
  869.     List<Color> previousColors = [];
  870.     return MaterialApp(
  871.       home: WillPopScope(
  872.         onWillPop: () async {
  873.           return true;
  874.         },
  875.         child: Scaffold(
  876.           appBar: AppBar(
  877.             title: const Text('Add Attendees by Scanning.'),
  878.             actions: [
  879.               IconButton(
  880.                 icon: Icon(Icons.add),
  881.                 onPressed: simulateScan,
  882.               ),
  883.             ],
  884.           ),
  885.           body: Column(
  886.             children: [
  887.               Row(
  888.                 children: [
  889.                   Expanded(
  890.                     child: ElevatedButton(
  891.                       onPressed: scanQR,
  892.                       child: Text('Scan QR', maxLines: 1,),
  893.                     ),
  894.                   ),
  895.                   Spacer(),
  896.                   Column(
  897.                     mainAxisAlignment: MainAxisAlignment.center,
  898.                     children: [
  899.                       Text('Accept Bluetooth Connections?'),
  900.                       Switch(
  901.                         value: _acceptBluetooth,
  902.                         onChanged: (bool value) {
  903.                           setState(() {
  904.                             _acceptBluetooth = value;
  905.                             if (_acceptBluetooth) {
  906.                               _startBluetoothScan();
  907.                             } else {
  908.                               _stopBluetoothScan();
  909.                               _randomPin = '';
  910.                             }
  911.                           });
  912.                         },
  913.                       ),
  914.                       if (_acceptBluetooth) Text('Random PIN: $_randomPin'),
  915.                       if (_isScanningBluetooth) CircularProgressIndicator(),
  916.                     ],
  917.                   ),
  918.                 ],
  919.               ),
  920.               Expanded(
  921.                 child: ListView.builder(
  922.                   itemCount: _scannedDataList.length,
  923.                   itemBuilder: (context, index) {
  924.                     final data = _scannedDataList[index];
  925.                     final color = generateRandomColor(previousColors);
  926.                     previousColors.add(color);
  927.                     if (previousColors.length > 5) {
  928.                       previousColors.removeAt(0);
  929.                     }
  930.                     return Dismissible(
  931.                       key: Key(data['id'].toString()),
  932.                       onDismissed: (direction) {
  933.                         setState(() {
  934.                           _scannedDataList.removeAt(index);
  935.                         });
  936.                       },
  937.                       background: Container(
  938.                         color: Colors.red,
  939.                         child: Icon(Icons.delete),
  940.                         alignment: Alignment.centerRight,
  941.                         padding: EdgeInsets.only(right: 16.0),
  942.                       ),
  943.                       child: Card(
  944.                         color: color,
  945.                         child: ListTile(
  946.                           title: Text('Name: ${data['username'] ?? ''}'),
  947.                           subtitle: Column(
  948.                             crossAxisAlignment: CrossAxisAlignment.start,
  949.                             children: [
  950.                               Text('Email: ${data['esEmail'] ?? ''}'),
  951.                               Text('ID: ${data['id']}'),
  952.                             ],
  953.                           ),
  954.                         ),
  955.                       ),
  956.                     );
  957.                   },
  958.                 ),
  959.               ),
  960.               Container(
  961.                 height: MediaQuery.of(context).size.height * 0.09,
  962.                 padding: const EdgeInsets.all(8.0),
  963.                 child: Row(
  964.                   mainAxisAlignment: MainAxisAlignment.spaceBetween,
  965.                   children: [
  966.                     ElevatedButton(
  967.                       onPressed: () {
  968.                         Navigator.pop(context);
  969.                       },
  970.                       child: Text('Cancel'),
  971.                     ),
  972.                     if (_scannedDataList.isNotEmpty)
  973.                       ElevatedButton(
  974.                         onPressed: () {
  975.                           Navigator.pop(context, _scannedDataList);
  976.                         },
  977.                         child: Text('Add Attendees'),
  978.                       ),
  979.                   ],
  980.                 ),
  981.               ),
  982.             ],
  983.           ),
  984.         ),
  985.       ),
  986.     );
  987.   }
  988. }
  989.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement