diff --git a/lib/components/lock_widget.dart b/lib/components/lock_widget.dart index 5c33c408..d1752991 100644 --- a/lib/components/lock_widget.dart +++ b/lib/components/lock_widget.dart @@ -10,7 +10,7 @@ class LockWidget extends StatelessWidget { Widget build(BuildContext context) { final lockProvider = Provider.of(context, listen: true); - return lockProvider.loading + return lockProvider.loadingDetail ? Center(child: CircularProgressIndicator()) : Column(mainAxisAlignment: MainAxisAlignment.start, children: [ Row( @@ -27,11 +27,7 @@ class LockWidget extends StatelessWidget { Center( child: Arc( centerWidget: InkWell( - child: (lockProvider.isLocked) - ? DeviceItemIcon.getLockIcon( - 175, WidgetStyleConstants.deviceDetailIconColorActive) - : DeviceItemIcon.getUnlockIcon(175, - WidgetStyleConstants.deviceDetailIconColorInactive), + child: getLockStateIcon(lockProvider), onTap: () { bool setLock = !lockProvider.isLocked; lockProvider.setLockUnlockAction( @@ -45,4 +41,14 @@ class LockWidget extends StatelessWidget { ), ]); } + + Widget getLockStateIcon(LockProvider lockProvider) { + return (lockProvider.loadingDetail || lockProvider.loadingAction) + ? Center(child: CircularProgressIndicator()) + : (lockProvider.isLocked) + ? DeviceItemIcon.getLockIcon( + 175, WidgetStyleConstants.deviceDetailIconColorActive) + : DeviceItemIcon.getUnlockIcon( + 175, WidgetStyleConstants.deviceDetailIconColorInactive); + } } diff --git a/lib/providers/lock_provider.dart b/lib/providers/lock_provider.dart index 11e8b50a..1e1f89dc 100644 --- a/lib/providers/lock_provider.dart +++ b/lib/providers/lock_provider.dart @@ -4,7 +4,8 @@ import 'package:yonomi_platform_sdk/repository/devices/lock_repository.dart'; import 'package:yonomi_platform_sdk/request/request.dart'; class LockProvider extends ChangeNotifier { - bool loading = false; + bool loadingDetail = false; + bool loadingAction = false; LockProvider(Request request, String deviceId) { _request = request; @@ -19,14 +20,35 @@ class LockProvider extends ChangeNotifier { bool get isLocked => _deviceDetail?.traits?.first?.state?.value ?? false; Future getDeviceDetail(String deviceId) async { - loading = true; + loadingDetail = true; + + notifyListeners(); + _deviceDetail = await DevicesRepository.getLockDetails(_request, deviceId); - loading = false; + loadingDetail = false; + notifyListeners(); } Future setLockUnlockAction(String deviceId, bool setLock) async { + loadingAction = true; + + notifyListeners(); + await LockRepository.sendLockUnlockAction(_request, deviceId, setLock); + + var maxRetries = 0; + while (_deviceDetail?.traits?.first?.state?.value != setLock && + maxRetries < 10) { + // Wait more time + _deviceDetail = + await DevicesRepository.getLockDetails(_request, deviceId); + await Future.delayed(Duration(milliseconds: 750)); + maxRetries++; + } + loadingAction = false; + + notifyListeners(); } }