feat: 完善设备连接、删除设备、搜索网络、连接网络页面

This commit is contained in:
liyi 2025-09-15 18:16:35 +08:00
parent 80d8a7b104
commit 47d9e666c1
13 changed files with 407 additions and 58 deletions

View File

@ -48,6 +48,16 @@ class BaseController extends GetxController {
); );
} }
@override
void onInit() {
super.onInit();
}
@override
void onReady() {
super.onReady();
}
@override @override
void onClose() { void onClose() {
if (EasyLoading.isShow) { if (EasyLoading.isShow) {

View File

@ -1,4 +1,6 @@
class AppViewParameterKeys { class AppViewParameterKeys {
static const String deviceList = "deviceList"; static const String deviceList = "deviceList";
static const String lockInfo = "lockInfo";
static const String networkInfo = "networkInfo";
} }

View File

@ -2,8 +2,12 @@ import 'package:get/get.dart';
import 'package:starwork_flutter/routes/app_routes.dart'; import 'package:starwork_flutter/routes/app_routes.dart';
import 'package:starwork_flutter/views/device/confirmPairDevice/confirm_pair_device_binding.dart'; import 'package:starwork_flutter/views/device/confirmPairDevice/confirm_pair_device_binding.dart';
import 'package:starwork_flutter/views/device/confirmPairDevice/confirm_pair_device_view.dart'; import 'package:starwork_flutter/views/device/confirmPairDevice/confirm_pair_device_view.dart';
import 'package:starwork_flutter/views/device/deviceConfigureNetwork/device_configure_network_binding.dart';
import 'package:starwork_flutter/views/device/deviceConfigureNetwork/device_configure_network_view.dart';
import 'package:starwork_flutter/views/device/deviceManage/device_manage_binding.dart'; import 'package:starwork_flutter/views/device/deviceManage/device_manage_binding.dart';
import 'package:starwork_flutter/views/device/deviceManage/device_manage_view.dart'; import 'package:starwork_flutter/views/device/deviceManage/device_manage_view.dart';
import 'package:starwork_flutter/views/device/deviceSearchNetwork/device_search_network_binding.dart';
import 'package:starwork_flutter/views/device/deviceSearchNetwork/device_search_network_view.dart';
import 'package:starwork_flutter/views/device/removeDevice/remove_device_binding.dart'; import 'package:starwork_flutter/views/device/removeDevice/remove_device_binding.dart';
import 'package:starwork_flutter/views/device/removeDevice/remove_device_view.dart'; import 'package:starwork_flutter/views/device/removeDevice/remove_device_view.dart';
import 'package:starwork_flutter/views/device/searchDevice/search_device_binding.dart'; import 'package:starwork_flutter/views/device/searchDevice/search_device_binding.dart';
@ -137,5 +141,15 @@ class AppPages {
page: () => RemoveDeviceView(), page: () => RemoveDeviceView(),
binding: RemoveDeviceBinding(), binding: RemoveDeviceBinding(),
), ),
GetPage(
name: AppRoutes.deviceConfigureNetwork,
page: () => DeviceConfigureNetworkView(),
binding: DeviceConfigureNetworkBinding(),
),
GetPage(
name: AppRoutes.deviceSearchNetwork,
page: () => DeviceSearchNetworkView(),
binding: DeviceSearchNetworkBinding(),
),
]; ];
} }

View File

@ -19,4 +19,6 @@ class AppRoutes{
static const String searchDevice = '/device/searchDevice'; static const String searchDevice = '/device/searchDevice';
static const String confirmPairDevice = '/device/confirmPairDevice'; static const String confirmPairDevice = '/device/confirmPairDevice';
static const String deviceRemoveDevice = '/device/removeDevice'; static const String deviceRemoveDevice = '/device/removeDevice';
static const String deviceSearchNetwork = '/device/searchNetwork';
static const String deviceConfigureNetwork = '/device/configureNetwork';
} }

View File

@ -0,0 +1,9 @@
import 'package:get/get.dart';
import 'package:starwork_flutter/views/device/deviceConfigureNetwork/device_configure_network_controller.dart';
class DeviceConfigureNetworkBinding implements Bindings {
@override
void dependencies() {
Get.lazyPut(() => DeviceConfigureNetworkController());
}
}

View File

@ -0,0 +1,45 @@
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:starcloud/entity/star_cloud_lock_list.dart';
import 'package:starcloud/entity/star_cloud_search_wifi_result.dart';
import 'package:starcloud/sdk/sdk_configure_network_operate_extension.dart';
import 'package:starcloud/sdk/starcloud.dart';
import 'package:starwork_flutter/base/base_controller.dart';
import 'package:starwork_flutter/common/constant/app_view_parameter_keys.dart';
class DeviceConfigureNetworkController extends BaseController {
//
StarCloudLock? lockInfo;
StarCloudSearchWifiResult? networkInfo;
TextEditingController wifiNameInputController = TextEditingController();
@override
void onReady() {
super.onReady();
//
final args = Get.arguments;
if (args != null && args.containsKey(AppViewParameterKeys.lockInfo)) {
final json = args[AppViewParameterKeys.lockInfo];
lockInfo = StarCloudLock.fromJson(json, 0);
}
if (args != null && args.containsKey(AppViewParameterKeys.networkInfo)) {
final json = args[AppViewParameterKeys.networkInfo];
networkInfo = StarCloudSearchWifiResult.fromJson(json);
}
}
void configureNetwork() {
StarCloudSDK.instance.connectWiFi(
lockId: lockInfo!.lockId,
onError: (err) {
print("配置网络失败:${err}");
},
onSuccess: () {},
wifiName: networkInfo!.ssid,
wifiPassword: '',
clientId: '',
starLockPeerId: '',
);
}
}

View File

@ -0,0 +1,80 @@
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/common/constant/app_colors.dart';
import 'package:starwork_flutter/common/widgets/custome_app_bar_wdiget.dart';
import 'package:starwork_flutter/views/device/deviceConfigureNetwork/device_configure_network_controller.dart';
class DeviceConfigureNetworkView extends GetView<DeviceConfigureNetworkController> {
@override
Widget build(BuildContext context) {
// 使使 controller
final _ = controller; //
return Scaffold(
backgroundColor: AppColors.scaffoldBackgroundColor,
appBar: CustomAppBarWidget(
title: '配置网络'.tr,
),
body: SafeArea(
child: Column(
children: [
Container(
height: 38.h,
padding: EdgeInsets.symmetric(
horizontal: 10.w,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
child: Row(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'*',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w500,
color: Colors.red,
),
),
Text(
'团队名称',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
],
),
Expanded(
// 使Expanded来确保TextField可以正确填充剩余空间
child: TextField(
controller: controller.wifiNameInputController,
keyboardType: TextInputType.text,
textInputAction: TextInputAction.done,
textAlign: TextAlign.end,
decoration: InputDecoration(
hintText: '请输入团队/家庭名称'.tr,
//
border: InputBorder.none,
//
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
),
),
),
],
),
),
],
),
),
);
}
}

View File

@ -288,63 +288,70 @@ class DeviceManageView extends GetView<DeviceManageController> {
itemCount: controller.filteredDeviceList.length, itemCount: controller.filteredDeviceList.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final lock = controller.filteredDeviceList[index]; final lock = controller.filteredDeviceList[index];
return Container( return GestureDetector(
width: double.infinity, onTap: () {
decoration: BoxDecoration( Get.toNamed(AppRoutes.deviceSearchNetwork, arguments: {
color: Colors.white, 'lockInfo': lock.toJson(),
borderRadius: BorderRadius.all(Radius.circular(8.r)), });
), },
padding: EdgeInsets.symmetric( child: Container(
horizontal: 10.w, width: double.infinity,
), decoration: BoxDecoration(
alignment: Alignment.centerLeft, color: Colors.white,
child: Obx( borderRadius: BorderRadius.all(Radius.circular(8.r)),
() => Column( ),
mainAxisAlignment: MainAxisAlignment.center, padding: EdgeInsets.symmetric(
crossAxisAlignment: CrossAxisAlignment.start, horizontal: 10.w,
children: [ ),
if (controller.selectedDeviceType.value.iconImagePath != null) alignment: Alignment.centerLeft,
Image( child: Obx(
image: AssetImage(controller.selectedDeviceType.value.iconImagePath!), () => Column(
width: 26.w, mainAxisAlignment: MainAxisAlignment.center,
height: 26.w, crossAxisAlignment: CrossAxisAlignment.start,
fit: BoxFit.contain, children: [
gaplessPlayback: true, if (controller.selectedDeviceType.value.iconImagePath != null)
// Image(
filterQuality: FilterQuality.medium, image: AssetImage(controller.selectedDeviceType.value.iconImagePath!),
// width: 26.w,
errorBuilder: (context, error, stackTrace) { height: 26.w,
return Icon( fit: BoxFit.contain,
Icons.image_not_supported, gaplessPlayback: true,
size: 26.sp, //
color: Colors.grey, filterQuality: FilterQuality.medium,
); //
}, errorBuilder: (context, error, stackTrace) {
return Icon(
Icons.image_not_supported,
size: 26.sp,
color: Colors.grey,
);
},
),
SizedBox(
height: 6.h,
), ),
SizedBox( Text(
height: 6.h, lock.lockName,
), style: TextStyle(
Text( fontSize: 10.sp,
lock.lockName, fontWeight: FontWeight.w400,
style: TextStyle( ),
fontSize: 10.sp, maxLines: 1,
fontWeight: FontWeight.w400, overflow: TextOverflow.ellipsis,
), ),
maxLines: 1, SizedBox(
overflow: TextOverflow.ellipsis, height: 4.h,
),
SizedBox(
height: 4.h,
),
Text(
lock.isOnline ?? false ? '在线' : '离线',
style: TextStyle(
color: lock.isOnline ?? false ? Colors.green : Colors.grey,
fontSize: 10.sp,
fontWeight: FontWeight.w500,
), ),
) Text(
], lock.isOnline ?? false ? '在线' : '离线',
style: TextStyle(
color: lock.isOnline ?? false ? Colors.green : Colors.grey,
fontSize: 10.sp,
fontWeight: FontWeight.w500,
),
)
],
),
), ),
), ),
); );

View File

@ -0,0 +1,9 @@
import 'package:get/get.dart';
import 'package:starwork_flutter/views/device/deviceSearchNetwork/device_search_network_controller.dart';
class DeviceSearchNetworkBinding extends Bindings{
@override
void dependencies() {
Get.lazyPut(() => DeviceSearchNetworkController());
}
}

View File

@ -0,0 +1,45 @@
import 'package:get/get.dart';
import 'package:starcloud/entity/star_cloud_lock_list.dart';
import 'package:starcloud/entity/star_cloud_search_wifi_result.dart';
import 'package:starcloud/sdk/sdk_configure_network_operate_extension.dart';
import 'package:starcloud/sdk/starcloud.dart';
import 'package:starwork_flutter/base/app_logger.dart';
import 'package:starwork_flutter/base/base_controller.dart';
import 'package:starwork_flutter/common/constant/app_view_parameter_keys.dart';
class DeviceSearchNetworkController extends BaseController {
//
StarCloudLock? lockInfo;
// wifi列表
final searchResultWifiList = <StarCloudSearchWifiResult>[].obs;
@override
void onReady() {
super.onReady();
//
final args = Get.arguments;
if (args != null && args.containsKey(AppViewParameterKeys.lockInfo)) {
final json = args[AppViewParameterKeys.lockInfo];
lockInfo = StarCloudLock.fromJson(json, 0);
}
starSearchNetwork();
}
void starSearchNetwork() {
searchResultWifiList.clear();
showLoading();
StarCloudSDK.instance.searchWiFi(
lockId: lockInfo!.lockId,
onError: (err) {
print("搜索wifi失败:${err}");
hideLoading();
},
onSuccess: (List<StarCloudSearchWifiResult> result) {
searchResultWifiList.value = result;
searchResultWifiList.refresh();
hideLoading();
},
);
}
}

View File

@ -0,0 +1,125 @@
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:starcloud/entity/star_cloud_lock_list.dart';
import 'package:starwork_flutter/base/app_logger.dart';
import 'package:starwork_flutter/common/constant/app_colors.dart';
import 'package:starwork_flutter/common/constant/app_view_parameter_keys.dart';
import 'package:starwork_flutter/common/widgets/custome_app_bar_wdiget.dart';
import 'package:starwork_flutter/extension/function_extension.dart';
import 'package:starwork_flutter/routes/app_routes.dart';
import 'package:starwork_flutter/views/device/deviceSearchNetwork/device_search_network_controller.dart';
class DeviceSearchNetworkView extends GetView<DeviceSearchNetworkController> {
const DeviceSearchNetworkView({super.key});
@override
Widget build(BuildContext context) {
// 使使 controller
final _ = controller; //
return Scaffold(
backgroundColor: AppColors.scaffoldBackgroundColor,
appBar: CustomAppBarWidget(
title: '搜索网络'.tr,
actions: [
TextButton(
onPressed: () {
controller.starSearchNetwork();
},
child: Text(
'刷新'.tr,
style: TextStyle(
fontSize: 16.sp,
color: Colors.black87,
fontWeight: FontWeight.w500,
),
),
)
],
),
body: SafeArea(
child: Column(
children: [
Expanded(
child: Obx(
() {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: ListView.builder(
itemBuilder: (context, index) {
final item = controller.searchResultWifiList[index];
return GestureDetector(
onTap: () {
Get.toNamed(
AppRoutes.deviceConfigureNetwork,
arguments: {
AppViewParameterKeys.lockInfo: controller.lockInfo?.toJson(),
AppViewParameterKeys.networkInfo: item.toJson(),
},
);
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
margin: EdgeInsets.only(
bottom: 10.h,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
item.ssid,
style: TextStyle(
fontSize: 16.sp,
color: Colors.black87,
),
),
Icon(
_getWifiSignalIcon(
item.rssi.toString(),
),
color: Colors.blue,
),
],
),
),
);
},
itemCount: controller.searchResultWifiList.length,
),
);
},
),
)
],
),
),
);
}
/// WiFi信号强度图标
IconData _getWifiSignalIcon(String rssi) {
final int rssiValue = int.parse(rssi);
if (rssiValue >= -50) {
return Icons.signal_wifi_4_bar;
} else if (rssiValue >= -70) {
return Icons.network_wifi;
} else if (rssiValue >= -80) {
return Icons.network_wifi_2_bar_rounded;
} else {
return Icons.signal_wifi_0_bar;
}
}
}

View File

@ -50,8 +50,6 @@ class HomeController extends BaseController {
isOpenNotificationPermission.value = await AppPermission.checkPermission( isOpenNotificationPermission.value = await AppPermission.checkPermission(
permission: Permission.notification, permission: Permission.notification,
); );
//
EventBusUtil().instance.fire(RefreshDeviceListEvent());
} }
// //

View File

@ -54,8 +54,8 @@ class MainController extends BaseController {
late StreamSubscription _refreshDeviceListSubscription; late StreamSubscription _refreshDeviceListSubscription;
@override @override
void onInit() { void onReady() {
super.onInit(); super.onReady();
/// ///
requestAllTeamInfoList(); requestAllTeamInfoList();
@ -214,15 +214,18 @@ class MainController extends BaseController {
} }
void _requestTeamDeviceList() async { void _requestTeamDeviceList() async {
showLoading();
await StarCloudSDK.instance.getDeviceList( await StarCloudSDK.instance.getDeviceList(
pageNo: 1, pageNo: 1,
pageSize: 999, pageSize: 999,
cloudUid: selectedTeam.value.teamCloudInfo!.uid!, cloudUid: selectedTeam.value.teamCloudInfo!.uid!,
onSuccess: (StarCloudLockList list) { onSuccess: (StarCloudLockList list) {
deviceCountSize.value = list.total; deviceCountSize.value = list.total;
hideLoading();
}, },
onError: (err) { onError: (err) {
AppLogger.error('获取设备列表失败:${err}'); AppLogger.error('获取设备列表失败:${err}');
hideLoading();
}, },
); );
} }