main.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:smartledz_wifi_test/plugin/wifi_plugin.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:smartledz_wifi_test/models/wifi_model.dart';
  7. import 'package:smartledz_wifi_test/utils/modal.dart';
  8. import 'package:smartledz_wifi_test/widgets/button_for_block.dart';
  9. import 'package:smartledz_wifi_test/widgets/wifi_item.dart';
  10. void main() {
  11. runApp(const MyApp());
  12. }
  13. class MyApp extends StatelessWidget {
  14. const MyApp({super.key});
  15. @override
  16. Widget build(BuildContext context) {
  17. return ScreenUtilInit(
  18. builder: (BuildContext context, Widget? child) {
  19. return MaterialApp(
  20. title: 'FX430 WIFI测试',
  21. theme: ThemeData(
  22. primarySwatch: Colors.blue,
  23. ),
  24. home: Scaffold(
  25. body: Column(
  26. children: [
  27. Container(
  28. color: Colors.blue,
  29. alignment: Alignment.center,
  30. child: SafeArea(
  31. left: false,
  32. right: false,
  33. bottom: false,
  34. child: Container(
  35. alignment: Alignment.center,
  36. height: 50.h,
  37. child: Text("FX430 WIFI测试", style: TextStyle(color: Colors.white, fontSize: 20.sp)),
  38. ),
  39. ),
  40. ),
  41. const Expanded(
  42. child: WifiList(),
  43. )
  44. ],
  45. ),
  46. ),
  47. );
  48. },
  49. );
  50. }
  51. }
  52. class WifiList extends StatefulWidget {
  53. const WifiList({Key? key}) : super(key: key);
  54. @override
  55. State<WifiList> createState() => _WifiListState();
  56. }
  57. class _WifiListState extends State<WifiList> {
  58. final List<WifiModel> _wifiList = []; // 扫描的wifi列表
  59. final List<String> _selectWifiList = []; // 已选择的wifi的bssid标识列表
  60. @override
  61. void initState() {
  62. super.initState();
  63. var eventChannel = const EventChannel('native_event_channel');
  64. eventChannel.receiveBroadcastStream().listen((dataStr) {
  65. Map jsonArr = jsonDecode(dataStr);
  66. debugPrint("收到通知事件 ---> $jsonArr");
  67. switch(jsonArr["cmd"]){
  68. case "scanResult": // 扫描
  69. setState(() {
  70. for (var element in _wifiList) { // 已存在则跳过
  71. if(element.bssid == jsonArr["bssid"]) return;
  72. }
  73. _wifiList.add(WifiModel(
  74. ssid: jsonArr["ssid"],
  75. bssid: jsonArr["bssid"],
  76. rssi: int.parse(jsonArr["level"])
  77. ));
  78. });
  79. break;
  80. case "scanComplete": // 扫描完成
  81. setState(() { // 检查已选列表的wifi是否真实存在
  82. _selectWifiList.removeWhere((bssid){
  83. for(WifiModel wifiModel in _wifiList){ // 已存在则不删除
  84. if(wifiModel.bssid == bssid) return false;
  85. }
  86. return true;
  87. });
  88. });
  89. break;
  90. }
  91. });
  92. startScanWifi();
  93. }
  94. // 扫描wifi
  95. void startScanWifi([void Function()? callback]){
  96. _wifiList.clear();
  97. WiFiPlugin.startScan();
  98. Future.delayed(const Duration(seconds: 3), (){
  99. callback?.call();
  100. });
  101. }
  102. // 开始测试
  103. void startTest(){
  104. if(_wifiList.isEmpty){
  105. Modal.toast(msg: "wifi列表为空,无法测试");
  106. return;
  107. }
  108. if(_selectWifiList.isNotEmpty){ // 有选中的wifi,则只处理选中的wifi
  109. eachTestWifiList(true);
  110. return;
  111. }
  112. // 处理全部wifi
  113. eachTestWifiList(false);
  114. }
  115. // 循环测试wifi列表
  116. void eachTestWifiList(bool isSelect, [int index=0]){
  117. int wifiIndex = index;
  118. if(isSelect == true){ // 处理选中设备
  119. if(index >= _selectWifiList.length){ // 处理完成
  120. return;
  121. }
  122. for(int i=0; i<_wifiList.length; i++){
  123. if(_wifiList[i].bssid == _selectWifiList[index]){
  124. wifiIndex = i; // 获取选中设备在wifi列表中的索引值
  125. return;
  126. }
  127. }
  128. }else{
  129. if(index >= _wifiList.length){ // 处理完成
  130. return;
  131. }
  132. }
  133. WifiModel wifiModel = _wifiList[wifiIndex];
  134. setState(()=>_wifiList[wifiIndex].result="正在测试");
  135. debugPrint("开始连接wifi ssid --> ${wifiModel.ssid} bssid --> ${wifiModel.bssid}");
  136. WiFiPlugin.connect(wifiModel.ssid, wifiModel.bssid, "12345678");
  137. }
  138. @override
  139. Widget build(BuildContext context) {
  140. return Column(
  141. children: [
  142. Expanded(
  143. child: ListView(
  144. padding: EdgeInsets.zero,
  145. children: List.generate(_wifiList.length, (index){
  146. WifiModel wifi = _wifiList[index];
  147. return WifiItem(
  148. wifiModel: wifi, // wifi模型
  149. active: _selectWifiList.contains(wifi.bssid), // 是否选中状态
  150. onTap: (WifiModel wifiModel){ // 列表点击事件
  151. setState(() {
  152. if(_selectWifiList.contains(wifi.bssid)){ // 已选中,则取消选中
  153. _selectWifiList.remove(wifi.bssid);
  154. }else{
  155. _selectWifiList.add(wifi.bssid);
  156. }
  157. });
  158. },
  159. );
  160. }),
  161. ),
  162. ),
  163. Row(
  164. children: [
  165. ButtonForBlock(
  166. title: "刷新列表",
  167. fontSize: 20.sp,
  168. radius: 0,
  169. bgColor: const Color(0xFFFFAA00),
  170. activeBgColor: const Color(0xFFAA8800),
  171. width: MediaQuery.of(context).size.width/2,
  172. height: 55.sp,
  173. onTap: (){
  174. Modal.openLoading(context: context, tip: "正在扫描wifi");
  175. startScanWifi((){
  176. Navigator.pop(context);
  177. });
  178. },
  179. ),
  180. ButtonForBlock(
  181. title: "开始测试",
  182. fontSize: 20.sp,
  183. radius: 0,
  184. width: MediaQuery.of(context).size.width/2,
  185. height: 55.sp,
  186. onTap: startTest,
  187. )
  188. ],
  189. )
  190. ],
  191. );
  192. }
  193. }