Commit 777787e2b374fe9064a73e71b0d681fc77300bf0

Authored by 权海
1 parent b5ac2c45

feat(ui):增加手表链接错误显示

@@ -8,7 +8,6 @@ import 'package:doublefeel_flutter/app/routes/app_pages.dart'; @@ -8,7 +8,6 @@ import 'package:doublefeel_flutter/app/routes/app_pages.dart';
8 import 'package:doublefeel_flutter/app/utils/dialog_utils.dart'; 8 import 'package:doublefeel_flutter/app/utils/dialog_utils.dart';
9 import 'package:doublefeel_flutter/core/config/app_environment_config.dart'; 9 import 'package:doublefeel_flutter/core/config/app_environment_config.dart';
10 import 'package:doublefeel_flutter/core/theme/app_theme.dart'; 10 import 'package:doublefeel_flutter/core/theme/app_theme.dart';
11 -import 'package:doublefeel_flutter/core/util/size_extensions.dart';  
12 import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart'; 11 import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
13 import 'package:doublefeel_flutter/data/models/local/user_preferences.dart'; 12 import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
14 import 'package:doublefeel_flutter/data/models/user/user_models.dart'; 13 import 'package:doublefeel_flutter/data/models/user/user_models.dart';
@@ -2,6 +2,7 @@ import 'dart:async'; @@ -2,6 +2,7 @@ import 'dart:async';
2 import 'dart:convert'; 2 import 'dart:convert';
3 3
4 import 'package:doublefeel_flutter/app/modules/friends/data/friends_repository.dart'; 4 import 'package:doublefeel_flutter/app/modules/friends/data/friends_repository.dart';
  5 +import 'package:doublefeel_flutter/app/modules/watch_theme/models/watch_device_extension.dart';
5 import 'package:doublefeel_flutter/core/network/api/friend_api.dart'; 6 import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
6 import 'package:doublefeel_flutter/core/network/api/theme_api.dart'; 7 import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
7 import 'package:doublefeel_flutter/core/result/app_result.dart'; 8 import 'package:doublefeel_flutter/core/result/app_result.dart';
@@ -32,6 +33,8 @@ class CustomWatchThemePreviewController extends GetxController { @@ -32,6 +33,8 @@ class CustomWatchThemePreviewController extends GetxController {
32 final friendThemeItem = Rx<WatchThemeItem?>(null); 33 final friendThemeItem = Rx<WatchThemeItem?>(null);
33 final selectedThemeItem = Rx<WatchThemeItem?>(null); 34 final selectedThemeItem = Rx<WatchThemeItem?>(null);
34 35
  36 + final watchConnectErrorDesc = Rx<String?>(null);
  37 +
35 bool get hasFriend { 38 bool get hasFriend {
36 return (friendThemeItem.value?.userId ?? 0) > 0; 39 return (friendThemeItem.value?.userId ?? 0) > 0;
37 } 40 }
@@ -143,8 +146,10 @@ class CustomWatchThemePreviewController extends GetxController { @@ -143,8 +146,10 @@ class CustomWatchThemePreviewController extends GetxController {
143 WearDeviceInfo? device; 146 WearDeviceInfo? device;
144 try { 147 try {
145 device = await WearEngineHostApi().checkConnectedDevice(); 148 device = await WearEngineHostApi().checkConnectedDevice();
146 - } catch (_) { 149 + watchConnectErrorDesc.value = device?.connectedDeviceDesc;
  150 + } catch (e) {
147 device = null; 151 device = null;
  152 + watchConnectErrorDesc.value = e.toString();
148 } 153 }
149 if (device?.isPaired != true || 154 if (device?.isPaired != true ||
150 device?.isReachable != true || 155 device?.isReachable != true ||
@@ -167,8 +172,10 @@ class CustomWatchThemePreviewController extends GetxController { @@ -167,8 +172,10 @@ class CustomWatchThemePreviewController extends GetxController {
167 WearDeviceInfo? device; 172 WearDeviceInfo? device;
168 try { 173 try {
169 device = await WearEngineHostApi().checkConnectedDevice(); 174 device = await WearEngineHostApi().checkConnectedDevice();
170 - } catch (_) { 175 + watchConnectErrorDesc.value = device?.connectedDeviceDesc;
  176 + } catch (e) {
171 device = null; 177 device = null;
  178 + watchConnectErrorDesc.value = e.toString();
172 } 179 }
173 if (device?.isPaired != true || 180 if (device?.isPaired != true ||
174 device?.isReachable != true || 181 device?.isReachable != true ||
@@ -2,6 +2,7 @@ import 'dart:async'; @@ -2,6 +2,7 @@ import 'dart:async';
2 import 'dart:convert'; 2 import 'dart:convert';
3 3
4 import 'package:doublefeel_flutter/app/modules/friends/data/friends_repository.dart'; 4 import 'package:doublefeel_flutter/app/modules/friends/data/friends_repository.dart';
  5 +import 'package:doublefeel_flutter/app/modules/watch_theme/models/watch_device_extension.dart';
5 import 'package:doublefeel_flutter/core/network/api/friend_api.dart'; 6 import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
6 import 'package:doublefeel_flutter/core/network/api/theme_api.dart'; 7 import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
7 import 'package:doublefeel_flutter/core/result/app_result.dart'; 8 import 'package:doublefeel_flutter/core/result/app_result.dart';
@@ -30,6 +31,8 @@ class WatchThemePreviewController extends GetxController { @@ -30,6 +31,8 @@ class WatchThemePreviewController extends GetxController {
30 final friendThemeItem = Rx<WatchThemeItem?>(null); 31 final friendThemeItem = Rx<WatchThemeItem?>(null);
31 final selectedThemeItem = Rx<WatchThemeItem?>(null); 32 final selectedThemeItem = Rx<WatchThemeItem?>(null);
32 33
  34 + final watchConnectErrorDesc = Rx<String?>(null);
  35 +
33 bool get hasFriend { 36 bool get hasFriend {
34 return (friendThemeItem.value?.userId ?? 0) > 0; 37 return (friendThemeItem.value?.userId ?? 0) > 0;
35 } 38 }
@@ -114,8 +117,10 @@ class WatchThemePreviewController extends GetxController { @@ -114,8 +117,10 @@ class WatchThemePreviewController extends GetxController {
114 WearDeviceInfo? device; 117 WearDeviceInfo? device;
115 try { 118 try {
116 device = await WearEngineHostApi().checkConnectedDevice(); 119 device = await WearEngineHostApi().checkConnectedDevice();
117 - } catch (_) { 120 + watchConnectErrorDesc.value = device?.connectedDeviceDesc;
  121 + } catch (e) {
118 device = null; 122 device = null;
  123 + watchConnectErrorDesc.value = e.toString();
119 } 124 }
120 if (device?.isPaired != true || 125 if (device?.isPaired != true ||
121 device?.isReachable != true || 126 device?.isReachable != true ||
@@ -139,8 +144,10 @@ class WatchThemePreviewController extends GetxController { @@ -139,8 +144,10 @@ class WatchThemePreviewController extends GetxController {
139 WearDeviceInfo? device; 144 WearDeviceInfo? device;
140 try { 145 try {
141 device = await WearEngineHostApi().checkConnectedDevice(); 146 device = await WearEngineHostApi().checkConnectedDevice();
142 - } catch (_) { 147 + watchConnectErrorDesc.value = device?.connectedDeviceDesc;
  148 + } catch (e) {
143 device = null; 149 device = null;
  150 + watchConnectErrorDesc.value = e.toString();
144 } 151 }
145 if (device?.isPaired != true || 152 if (device?.isPaired != true ||
146 device?.isReachable != true || 153 device?.isReachable != true ||
  1 +import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
  2 +
  3 +extension WatchDeviceExtension on WearDeviceInfo {
  4 + String? get connectedDeviceDesc {
  5 + if (isPaired != true) {
  6 + return '手表未配对';
  7 + }
  8 + if (isReachable != true) {
  9 + return '手表数据无法传递';
  10 + }
  11 + if (isWatchAppInstalled != true) {
  12 + return 'watch app未安装';
  13 + }
  14 + return null;
  15 + }
  16 +}
@@ -35,10 +35,13 @@ class CustomWatchThemePreviewView @@ -35,10 +35,13 @@ class CustomWatchThemePreviewView
35 padding: EdgeInsets.only(top: topPadding, bottom: 96), 35 padding: EdgeInsets.only(top: topPadding, bottom: 96),
36 child: Column( 36 child: Column(
37 children: [ 37 children: [
38 - WatchThemeHeader(  
39 - title: controller.themeItem.title,  
40 - themeImageUrl: controller.themeItem.energeticImage,  
41 - ), 38 + Obx(() {
  39 + return WatchThemeHeader(
  40 + title: controller.themeItem.title,
  41 + themeImageUrl: controller.themeItem.energeticImage,
  42 + errorDesc: controller.watchConnectErrorDesc.value,
  43 + );
  44 + }),
42 const SizedBox(height: 26), 45 const SizedBox(height: 26),
43 StatusPreviewCard(themeItem: controller.themeItem), 46 StatusPreviewCard(themeItem: controller.themeItem),
44 const SizedBox(height: 12), 47 const SizedBox(height: 12),
@@ -23,9 +23,12 @@ class WatchThemePreviewView extends GetView<WatchThemePreviewController> { @@ -23,9 +23,12 @@ class WatchThemePreviewView extends GetView<WatchThemePreviewController> {
23 padding: EdgeInsets.only(top: topPadding, bottom: 96), 23 padding: EdgeInsets.only(top: topPadding, bottom: 96),
24 child: Column( 24 child: Column(
25 children: [ 25 children: [
26 - WatchThemeHeader(  
27 - themeImageUrl: controller.themeItem.energeticImage,  
28 - ), 26 + Obx(() {
  27 + return WatchThemeHeader(
  28 + themeImageUrl: controller.themeItem.energeticImage,
  29 + errorDesc: controller.watchConnectErrorDesc.value,
  30 + );
  31 + }),
29 const SizedBox(height: 26), 32 const SizedBox(height: 26),
30 StatusPreviewCard(themeItem: controller.themeItem), 33 StatusPreviewCard(themeItem: controller.themeItem),
31 const SizedBox(height: 12), 34 const SizedBox(height: 12),
  1 +import 'package:doublefeel_flutter/core/config/app_environment_config.dart';
1 import 'package:flutter/material.dart'; 2 import 'package:flutter/material.dart';
2 import 'package:doublefeel_flutter/l10n/l10n_extensions.dart'; 3 import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
  4 +import 'package:get/get.dart';
3 5
4 import 'watch_face_preview.dart'; 6 import 'watch_face_preview.dart';
5 import 'watch_theme_colors.dart'; 7 import 'watch_theme_colors.dart';
@@ -8,14 +10,19 @@ class WatchThemeHeader extends StatelessWidget { @@ -8,14 +10,19 @@ class WatchThemeHeader extends StatelessWidget {
8 const WatchThemeHeader({ 10 const WatchThemeHeader({
9 super.key, 11 super.key,
10 this.title, 12 this.title,
  13 + this.errorDesc,
11 this.themeImageUrl, 14 this.themeImageUrl,
12 }); 15 });
13 16
  17 +
14 final String? title; 18 final String? title;
  19 + final String? errorDesc;
15 final String? themeImageUrl; 20 final String? themeImageUrl;
16 21
17 @override 22 @override
18 Widget build(BuildContext context) { 23 Widget build(BuildContext context) {
  24 + final environmentConfig = Get.find<AppEnvironmentConfig>();
  25 +
19 return Column( 26 return Column(
20 children: [ 27 children: [
21 SizedBox(height: 12), 28 SizedBox(height: 12),
@@ -35,6 +42,18 @@ class WatchThemeHeader extends StatelessWidget { @@ -35,6 +42,18 @@ class WatchThemeHeader extends StatelessWidget {
35 height: 1.25, 42 height: 1.25,
36 ), 43 ),
37 ), 44 ),
  45 + if (environmentConfig.isDebug && errorDesc != null) ...[
  46 + SizedBox(height: 8),
  47 + Text(
  48 + errorDesc!,
  49 + style: TextStyle(
  50 + color: WatchThemeColors.pro,
  51 + fontSize: 14,
  52 + fontWeight: FontWeight.w400,
  53 + ),
  54 + maxLines: 2,
  55 + ),
  56 + ],
38 ], 57 ],
39 ); 58 );
40 } 59 }