import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:smartledz_wifi_test/plugin/wifi_plugin.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:smartledz_wifi_test/models/wifi_model.dart'; import 'package:smartledz_wifi_test/utils/modal.dart'; import 'package:smartledz_wifi_test/widgets/button_for_block.dart'; import 'package:smartledz_wifi_test/widgets/wifi_item.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return ScreenUtilInit( builder: (BuildContext context, Widget? child) { return MaterialApp( title: 'SmartLEDZ WiFi Test', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( body: child!, ), ); }, child: const SafeArea( left: false, right: false, bottom: false, child: WifiList(), ), ); } } class WifiList extends StatefulWidget { const WifiList({Key? key}) : super(key: key); @override State createState() => _WifiListState(); } class _WifiListState extends State { final List _wifiList = []; // 扫描的wifi列表 final List _selectWifiList = []; // 已选择的wifi的bssid标识列表 late bool testing = false; // 是否测试中:false[否]、true[是] @override void initState() { super.initState(); var eventChannel = const EventChannel('native_event_channel'); eventChannel.receiveBroadcastStream().listen((dataStr) { Map jsonArr = jsonDecode(dataStr); debugPrint("收到通知事件 ---> $jsonArr"); switch(jsonArr["cmd"]){ case "scanResult": // 扫描 setState(() { _wifiList.add(WifiModel( ssid: jsonArr["ssid"], bssid: jsonArr["bssid"], rssi: int.parse(jsonArr["level"]) )); }); break; case "scanComplete": // 扫描完成 setState(() { // 检查已选列表的wifi是否真实存在 _selectWifiList.removeWhere((bssid){ for(WifiModel wifiModel in _wifiList){ // 已存在则不删除 if(wifiModel.bssid == bssid) return false; } return true; }); }); break; } }); startScanWifi(); Timer.periodic(const Duration(seconds: 3), (timer) { if(testing) return; // 测试中,忽略定时扫描 startScanWifi(); // 定时调用扫描方法 }); } // 扫描wifi void startScanWifi(){ _wifiList.clear(); WiFiPlugin.startScan(); } // 开始测试 void startTest(){ if(_wifiList.isEmpty){ Modal.toast(msg: "wifi列表为空,无法测试"); return; } testing = true; // 置为测试状态 if(_selectWifiList.isNotEmpty){ // 有选中的wifi,则只处理选中的wifi eachTestWifiList(true); return; } // 处理全部wifi eachTestWifiList(false); } // 循环测试wifi列表 void eachTestWifiList(bool isSelect, [int index=0]){ int wifiIndex = index; if(isSelect == true){ // 处理选中设备 if(index >= _selectWifiList.length){ // 处理完成 testing = false; return; } for(int i=0; i<_wifiList.length; i++){ if(_wifiList[i].bssid == _selectWifiList[index]){ wifiIndex = i; // 获取选中设备在wifi列表中的索引值 return; } } }else{ if(index >= _wifiList.length){ // 处理完成 testing = false; return; } } WifiModel wifiModel = _wifiList[wifiIndex]; setState(()=>_wifiList[wifiIndex].result="正在测试"); debugPrint("开始连接wifi ssid --> ${wifiModel.ssid} bssid --> ${wifiModel.bssid}"); WiFiPlugin.connect(wifiModel.ssid, wifiModel.bssid, "12345678"); testing = false; // TODO developer,置为非测试状态 } @override Widget build(BuildContext context) { return Column( children: [ Expanded( child: ListView( children: List.generate(_wifiList.length, (index){ WifiModel wifi = _wifiList[index]; return WifiItem( wifiModel: wifi, // wifi模型 active: _selectWifiList.contains(wifi.bssid), // 是否选中状态 onTap: (WifiModel wifiModel){ // 列表点击事件 setState(() { if(_selectWifiList.contains(wifi.bssid)){ // 已选中,则取消选中 _selectWifiList.remove(wifi.bssid); }else{ _selectWifiList.add(wifi.bssid); } }); }, ); }), ), ), ButtonForBlock( title: "开始测试", fontSize: 20.sp, radius: 0, width: MediaQuery.of(context).size.width, height: 55.sp, onTap: startTest, ) ], ); } }