|
|
|
import 'package:doublefeel_flutter/app/modules/friends/controllers/friend_trend_controller.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/network/api/user_api.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/result/app_result.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/services/user_state_service.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/local/local_storage.dart';
|
|
|
|
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:flutter/scheduler.dart';
|
|
|
|
|
|
|
|
import 'package:get/get.dart';
|
|
|
|
|
|
|
|
import '../../../routes/app_pages.dart';
|
|
|
|
import '../../purchase/purchase_route_args.dart';
|
|
|
|
import '../../app_review_prompt/logic/app_review_prompt_logic.dart';
|
|
|
|
import '../../report_common/models/report_period.dart';
|
|
|
|
import 'today_controller.dart';
|
|
|
|
import 'trend/trend_controller.dart';
|
|
|
|
|
|
|
|
class HomeController extends GetxController {
|
|
...
|
...
|
@@ -20,6 +27,7 @@ class HomeController extends GetxController { |
|
|
|
);
|
|
|
|
final LocalStorage _storage = Get.find<LocalStorage>();
|
|
|
|
final UserStateService userStateService = Get.find<UserStateService>();
|
|
|
|
final PlatformHostApi _platformHostApi = PlatformHostApi();
|
|
|
|
|
|
|
|
/// 当前选中的底部 tab 索引
|
|
|
|
final selectedIndex = 0.obs;
|
|
...
|
...
|
@@ -29,6 +37,16 @@ class HomeController extends GetxController { |
|
|
|
void onInit() {
|
|
|
|
super.onInit();
|
|
|
|
_mainChannel.setMethodCallHandler(_handleNativeMethodCall);
|
|
|
|
SchedulerBinding.instance.addPostFrameCallback((_) async {
|
|
|
|
try {
|
|
|
|
final route = await _platformHostApi.requestUnhandedUrl();
|
|
|
|
// final route ='doublefeel://flutter/home?tab=today&scroll_to_latest_hrv=true';
|
|
|
|
// final route = 'doublefeel://flutter/friend-home?user_id=131';
|
|
|
|
// final route = 'doublefeel://flutter/home?tab=trend&type=sleep';
|
|
|
|
// final route ='doublefeel://flutter/friend-trend?type=sleep&user_id=131';
|
|
|
|
_checkFlutterRoute(route);
|
|
|
|
} catch (_) {}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
...
|
...
|
@@ -37,15 +55,6 @@ class HomeController extends GetxController { |
|
|
|
super.onClose();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void onReady() async {
|
|
|
|
final unhandedUrl = await PlatformHostApi().requestUnhandedUrl();
|
|
|
|
debugPrint(
|
|
|
|
'[HomeController] requestUnhandedUrl: '
|
|
|
|
'result: ${unhandedUrl}',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<Object?> _handleNativeMethodCall(MethodCall call) async {
|
|
|
|
switch (call.method) {
|
|
|
|
case 'handleFlutterUrl':
|
|
...
|
...
|
@@ -66,7 +75,7 @@ class HomeController extends GetxController { |
|
|
|
_ => '',
|
|
|
|
};
|
|
|
|
lastFlutterUrl.value = url;
|
|
|
|
debugPrint('[HomeController.handleFlutterUrl] url: $url');
|
|
|
|
_checkFlutterRoute(url);
|
|
|
|
return url.isNotEmpty;
|
|
|
|
}
|
|
|
|
|
|
...
|
...
|
@@ -107,4 +116,126 @@ class HomeController extends GetxController { |
|
|
|
|
|
|
|
int _dateKey(DateTime date) =>
|
|
|
|
date.year * 10000 + date.month * 100 + date.day;
|
|
|
|
|
|
|
|
_checkFlutterRoute(String? route) {
|
|
|
|
try {
|
|
|
|
if (route == null || route.isEmpty) return;
|
|
|
|
|
|
|
|
final uri = Uri.tryParse(route);
|
|
|
|
if (uri == null) return;
|
|
|
|
|
|
|
|
final path = uri.path; // "/home", "/account-settings" 等
|
|
|
|
final params = uri.queryParameters; // {"tab": "today"} 等
|
|
|
|
|
|
|
|
_dispatchRoute(path, params);
|
|
|
|
} catch (_) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 根据 path + query 参数分派导航动作
|
|
|
|
void _dispatchRoute(String path, Map<String, String> params) {
|
|
|
|
switch (path) {
|
|
|
|
case AppRoutes.home:
|
|
|
|
_switchHomeTab(params['tab'], params);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
// 其他已注册路由 → 跳转页面,query 参数作为 arguments 传入
|
|
|
|
final isKnown = Get.routeTree.routes.any((r) => r.name == path);
|
|
|
|
if (!isKnown) return;
|
|
|
|
if (path == Routes.FRIEND_HOME || path == Routes.FRIEND_TREND) {
|
|
|
|
final paramUserId = params['user_id'];
|
|
|
|
if (paramUserId != null) {
|
|
|
|
final friendUserId = int.tryParse(paramUserId);
|
|
|
|
if (friendUserId != null) {
|
|
|
|
final _friendApi = Get.find<FriendApi>();
|
|
|
|
_friendApi.getFriendInfo(friendUserId).then((result) {
|
|
|
|
switch (result) {
|
|
|
|
case AppSuccess(data: final info):
|
|
|
|
{
|
|
|
|
if (path == Routes.FRIEND_TREND) {
|
|
|
|
TrendType? trendType =
|
|
|
|
getTrendType(params['type'] ?? '');
|
|
|
|
if (trendType != null) {
|
|
|
|
Get.toNamed(path,
|
|
|
|
arguments: FriendTrendArguments(
|
|
|
|
friendItem: info,
|
|
|
|
initialTypeIndex: trendType.tabIndex,
|
|
|
|
));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Get.toNamed(path, arguments: info);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case AppFailure():
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Get.toNamed(path, arguments: params.isNotEmpty ? params : null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 根据 tab 名称切换首页底部 tab
|
|
|
|
void _switchHomeTab(String? tab, Map<String, String> params) {
|
|
|
|
switch (tab) {
|
|
|
|
case 'today':
|
|
|
|
changeTab(0);
|
|
|
|
final scrollToLatestHrv =
|
|
|
|
params['scroll_to_latest_hrv']?.toLowerCase() == 'true';
|
|
|
|
if (scrollToLatestHrv) {
|
|
|
|
SchedulerBinding.instance.addPostFrameCallback((_) {
|
|
|
|
final todayCtrl = Get.find<TodayController>();
|
|
|
|
if (todayCtrl.scrollController.hasClients) {
|
|
|
|
todayCtrl.scrollController.animateTo(
|
|
|
|
850,
|
|
|
|
duration: const Duration(milliseconds: 400),
|
|
|
|
curve: Curves.easeInOut,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'trend':
|
|
|
|
changeTab(trendTabIndex);
|
|
|
|
final type = params['type'];
|
|
|
|
if (type != null) {
|
|
|
|
SchedulerBinding.instance.addPostFrameCallback((_) {
|
|
|
|
TrendType? trendType = getTrendType(type);
|
|
|
|
if (trendType != null) {
|
|
|
|
openTrend(
|
|
|
|
trendType,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'friends':
|
|
|
|
changeTab(2);
|
|
|
|
break;
|
|
|
|
case 'my':
|
|
|
|
changeTab(3);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TrendType? getTrendType(String type) {
|
|
|
|
switch (type) {
|
|
|
|
case 'sleep':
|
|
|
|
return TrendType.sleep;
|
|
|
|
|
|
|
|
case 'activity':
|
|
|
|
return TrendType.activity;
|
|
|
|
|
|
|
|
case 'hrv':
|
|
|
|
return TrendType.hrv;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|