Commit ccc6eada7cf558ee1d3e418c93492073cde8104e

Authored by 权海
1 parent b5678373

feat(ui):增加pegion多平台分发,支持Ohos

Showing 33 changed files with 602 additions and 238 deletions
... ... @@ -52,6 +52,9 @@ PODS:
- libwebp/webp (1.5.0):
- libwebp/sharpyuv
- OBS (3.20.11.1)
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- permission_handler_apple (9.4.8):
- Flutter
- PromisesObjC (2.4.1)
... ... @@ -103,6 +106,7 @@ DEPENDENCIES:
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- OBS (from `./Runner/Library`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
... ... @@ -141,6 +145,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/image_picker_ios/ios"
OBS:
:path: "./Runner/Library"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
share_plus:
... ... @@ -167,15 +173,16 @@ SPEC CHECKSUMS:
GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_cropper: c4326ea50132b1e1564499e5d32a84f01fb03537
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
OBS: 4cf1e6db5515aefd6c3c6ae3e90e85ea5f028e83
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e
PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
PromisesSwift: 217dea0fd5d2ad65222a109c48698add13cc1c5b
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
TAThirdParty: 65db0235cd209237781535f19f9d0eef706156e5
thinking_analytics: 6f254c030da8dfc3409c08d91929b6ad89c415be
... ...
import 'package:doublefeel_flutter/app/routes/app_pages.dart';
import 'package:doublefeel_flutter/core/logging/app_logger.dart';
import 'package:doublefeel_flutter/data/local/local_storage.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
... ... @@ -11,14 +11,14 @@ class AppReviewPromptLogic {
AppReviewPromptLogic({
required LocalStorage storage,
required int Function() userIdProvider,
PlatformHostApi? platformHostApi,
AppPlatformHostApi? platformHostApi,
}) : _storage = storage,
_userIdProvider = userIdProvider,
_platformHostApi = platformHostApi ?? PlatformHostApi();
_platformHostApi = platformHostApi ?? AppPlatformHostApi();
final LocalStorage _storage;
final int Function() _userIdProvider;
final PlatformHostApi _platformHostApi;
final AppPlatformHostApi _platformHostApi;
bool _isShowing = false;
... ...
... ... @@ -14,14 +14,14 @@ import 'package:doublefeel_flutter/core/util/app_toast.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/data/models/friend/friend_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:lottie/lottie.dart';
class BindPartnerController extends GetxController {
BindPartnerController(this._friendApi);
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final FriendApi _friendApi;
... ... @@ -86,7 +86,7 @@ class BindPartnerController extends GetxController {
try {
ta.track('click_doublefeel_add_friend_page',
properties: {'channel_type': channel, 'click_content': '分享我的码'});
final success = await PlatformHostApi()
final success = await AppPlatformHostApi()
.shareText(l10n.sharePartnerCodeTemplate(myInviteCode.value));
} catch (e) {
AppToast.show(e.toString());
... ...
... ... @@ -14,7 +14,7 @@ import '../../../../core/services/raw_data_service/health_raw_models.dart';
import '../../../../core/services/raw_data_service/platform_ios/apple_health_raw_local_notification.dart';
import '../../../../data/local/user_preferences_storage.dart';
import '../../../../l10n/l10n_extensions.dart';
import '../../../../pigeon/platform_api.g.dart';
import '../../../../core/platform/pigeon_api_facade.dart';
import '../../../routes/app_pages.dart';
class DeveloperOptionsItem {
... ... @@ -49,7 +49,7 @@ class DeveloperOptionsController extends GetxController {
final UserPreferencesStorage _userPreferencesStorage;
final HealthRawDataCoreService _healthRawDataCoreService;
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final TextEditingController tokenController = TextEditingController();
final List<DeveloperOptionsItem> options = const [
... ...
... ... @@ -4,7 +4,7 @@ import 'package:doublefeel_flutter/core/network/api/user_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/util/app_toast.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
... ... @@ -23,7 +23,7 @@ class SubmitFeedbackController extends GetxController {
final ImagePicker _picker = ImagePicker();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
@override
void onInit() {
... ...
... ... @@ -12,7 +12,7 @@ import 'package:doublefeel_flutter/data/local/user_account_storage.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:get/get.dart';
import '../data/friends_repository.dart';
... ... @@ -36,7 +36,7 @@ class FriendsController extends GetxController {
_userAccountStorage =
userAccountStorage ?? Get.find<UserAccountStorage>(),
_updateWatchOtherUserInfo = updateWatchOtherUserInfo ??
((info) => PlatformHostApi().refreshWatchAppAndWidgets());
((info) => AppPlatformHostApi().refreshWatchAppAndWidgets());
static const maxFriends = 10;
... ... @@ -299,7 +299,7 @@ class FriendsController extends GetxController {
Future<void> _refreshWatchAppAndWidgetsAfterFriendDeleted() async {
try {
await PlatformHostApi().refreshWatchAppAndWidgets();
await AppPlatformHostApi().refreshWatchAppAndWidgets();
} catch (error, stackTrace) {
AppLogger.e(
'FriendsController.refreshWatchAppAndWidgetsAfterFriendDeleted failed',
... ...
... ... @@ -8,7 +8,7 @@ import 'package:doublefeel_flutter/core/services/raw_data_service/health_raw_dat
import 'package:doublefeel_flutter/core/services/thinking_data_service.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:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
... ... @@ -32,7 +32,7 @@ class HomeController extends GetxController {
final LocalStorage _storage = Get.find<LocalStorage>();
final UserStateService userStateService = Get.find<UserStateService>();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
/// 当前选中的底部 tab 索引
final selectedIndex = 0.obs;
... ...
... ... @@ -10,7 +10,7 @@ import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/data/models/user/user_models.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:get/get.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
... ... @@ -24,7 +24,7 @@ class MyController extends GetxController {
final ImagePicker _picker = ImagePicker();
final watchThemeItems = <WatchThemeItem>[].obs;
final isLoadingWatchThemes = false.obs;
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
List<WatchThemeItem> get officialWatchThemes =>
watchThemeItems.where((theme) => theme.isOfficialTheme).toList();
... ...
... ... @@ -28,9 +28,7 @@ import 'package:doublefeel_flutter/data/models/health/health_v2_models.dart';
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/data/models/pay/pay_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/health_kit_api.g.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
... ... @@ -74,7 +72,7 @@ class TodayController extends GetxController with WidgetsBindingObserver {
final HealthDataSource _healthApi;
final FriendApi _friendApi;
final UserStateService _userStateService;
final HealthKitHostApi _hostApi = HealthKitHostApi();
final AppHealthKitHostApi _hostApi = AppHealthKitHostApi();
final HealthRawDataCoreService _healthRawDataCoreService =
Get.find<HealthRawDataCoreService>();
... ... @@ -198,7 +196,7 @@ class TodayController extends GetxController with WidgetsBindingObserver {
showHrvAdBanner.value = false;
} else {
try {
WearEngineHostApi()
AppWearEngineHostApi()
.hasInstalledWatchSurface()
.then((hasInstalledWatchSurface) {
showHrvAdBanner.value = !hasInstalledWatchSurface;
... ... @@ -733,7 +731,7 @@ class TodayController extends GetxController with WidgetsBindingObserver {
final yearlyProduct = Rxn<PayProduct>();
final yearlyProductAppleInfo = Rxn<AppleProductInfo>();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
Future<void> getProductList() async {
final result = await _payApi.getProductList();
... ...
... ... @@ -12,7 +12,7 @@ import 'package:doublefeel_flutter/core/services/thinking_data_service.dart';
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/l10n/gen/app_localizations.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
... ... @@ -154,7 +154,7 @@ class LoginController extends GetxController {
}
try {
final result = await LoadingService.instance.run(() async {
return await PlatformHostApi().requestAppleSignIn();
return await AppPlatformHostApi().requestAppleSignIn();
}, type: LoadingType.circular);
// result 为 null 或 identityToken 为空,说明用户取消或苹果授权失败
if (result == null ||
... ... @@ -175,7 +175,7 @@ class LoginController extends GetxController {
void onGoogleLoginPressed() async {
try {
final result = await LoadingService.instance.run(() async {
return await PlatformHostApi().requestGoogleSignIn();
return await AppPlatformHostApi().requestGoogleSignIn();
}, type: LoadingType.circular);
// result 为 null 或 identityToken 为空,说明用户取消或苹果授权失败
if (result == null ||
... ... @@ -628,7 +628,7 @@ class LoginController extends GetxController {
try {
if (Get.isRegistered<AppEnvironmentConfig>()) {
var env = Get.find<AppEnvironmentConfig>();
await PlatformHostApi().updateLoginInfo(
await AppPlatformHostApi().updateLoginInfo(
jsonEncode(UserPreferences(
accessToken: accessToken,
meUserInfo: me,
... ...
... ... @@ -4,7 +4,7 @@ import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/core/util/app_toast.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
... ... @@ -155,7 +155,7 @@ Future<void> sendFeedbackEmail({
'This issue was reported from $pageName by User ID: $cleanUserId.';
try {
await PlatformHostApi()
await AppPlatformHostApi()
.sendEmail('support@doublefeel.cn', 'DoubleFeel Feedback', body);
} catch (_) {}
}
... ...
... ... @@ -9,7 +9,7 @@ import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/data/models/pay/apple_pay_order_response.dart';
import 'package:doublefeel_flutter/data/models/pay/pay_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
... ... @@ -23,7 +23,7 @@ class MembershipDetailController extends GetxController {
final UserPreferencesStorage _userPreferences =
Get.find<UserPreferencesStorage>();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final isRestoring = false.obs;
final scrollController = ScrollController();
... ...
... ... @@ -8,7 +8,7 @@ import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/data/models/pay/apple_pay_order_response.dart';
import 'package:doublefeel_flutter/data/models/pay/pay_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:get/get.dart';
import '../../../routes/app_pages.dart';
... ... @@ -21,7 +21,7 @@ class MembershipOfferController extends GetxController {
final UserPreferencesStorage _userPreferences =
Get.find<UserPreferencesStorage>();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final isUnlocking = false.obs;
Future<void> unlock() async {
... ... @@ -92,7 +92,8 @@ class MembershipOfferController extends GetxController {
trackMap['currency_code'] = appleInfo?.currencyCode ?? '';
var actualPrice = appleInfo?.price ?? 0;
trackMap['actual_price'] = actualPrice > 0 ? actualPrice : (appleInfo?.originPrice ?? 0);
trackMap['actual_price'] =
actualPrice > 0 ? actualPrice : (appleInfo?.originPrice ?? 0);
ta.track(
'success_doublefeel_pay_order',
... ...
... ... @@ -3,7 +3,7 @@ import 'package:doublefeel_flutter/app/routes/app_pages.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/data/models/pay/pay_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:lottie/lottie.dart';
... ...
... ... @@ -16,7 +16,7 @@ import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/data/models/pay/apple_pay_order_response.dart';
import 'package:doublefeel_flutter/data/models/pay/pay_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
... ... @@ -52,7 +52,7 @@ class PurchaseController extends GetxController {
final VipApi _vipApi = Get.find<VipApi>();
final UserPreferencesStorage _userPreferences =
Get.find<UserPreferencesStorage>();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final scrollController = ScrollController();
final planScrollController = ScrollController();
... ... @@ -454,9 +454,8 @@ class PurchaseController extends GetxController {
'product_type': plan?.product?.appleId,
'price': plan?.product?.price,
'currency_code': appleInfo?.currencyCode ?? '',
'actual_price': actualPrice > 0
? actualPrice
: (appleInfo?.originPrice ?? 0),
'actual_price':
actualPrice > 0 ? actualPrice : (appleInfo?.originPrice ?? 0),
},
);
}
... ...
... ... @@ -7,8 +7,7 @@ import 'package:doublefeel_flutter/core/services/thinking_data_service.dart';
import 'package:doublefeel_flutter/core/services/user_state_service.dart';
import 'package:doublefeel_flutter/data/local/user_account_storage.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/pigeon/health_kit_api.g.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
... ... @@ -24,8 +23,8 @@ class UserOnboardingController extends GetxController {
UserOnboardingController(this._userApi);
final UserApi _userApi;
final HealthKitHostApi _hostApi = HealthKitHostApi();
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppHealthKitHostApi _hostApi = AppHealthKitHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
bool hasSelection(int pageIndex) =>
selections[pageIndex]?.isNotEmpty ?? false;
... ...
... ... @@ -7,8 +7,7 @@ import 'package:doublefeel_flutter/core/constants/app_const.dart';
import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/util/app_toast.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
... ... @@ -22,8 +21,8 @@ class CreateWatchThemeController extends GetxController {
CreateWatchThemeController(this._themeApi);
final ThemeApi _themeApi;
final PlatformHostApi _platformHostApi = PlatformHostApi();
final WearEngineHostApi _wearEngineHostApi = WearEngineHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final AppWearEngineHostApi _wearEngineHostApi = AppWearEngineHostApi();
final ImagePicker _imagePicker = ImagePicker();
final customThemeName = ''.obs;
... ...
... ... @@ -6,8 +6,7 @@ import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/util/app_toast.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
... ... @@ -119,7 +118,7 @@ class CustomWatchThemePreviewController extends GetxController {
AppToast.show(l10n.watchThemeDeleteFailed);
return;
}
await WearEngineHostApi().syncWatchTheme(null);
await AppWearEngineHostApi().syncWatchTheme(null);
AppToast.show(l10n.watchThemeDeleted);
Get.back();
}
... ... @@ -139,13 +138,13 @@ class CustomWatchThemePreviewController extends GetxController {
if (selectedFriend == null) return;
await loadFriendTheme();
PlatformHostApi().refreshWatchAppAndWidgets();
AppPlatformHostApi().refreshWatchAppAndWidgets();
}
Future<void> addWatchFace() async {
WearDeviceInfo? device;
try {
device = await WearEngineHostApi().checkConnectedDevice();
device = await AppWearEngineHostApi().checkConnectedDevice();
} catch (e) {
device = null;
}
... ... @@ -157,17 +156,17 @@ class CustomWatchThemePreviewController extends GetxController {
return;
}
try {
await WearEngineHostApi().addWatchSurface();
await AppWearEngineHostApi().addWatchSurface();
} catch (_) {
// Opening the Watch app still helps the user install the watch face.
}
await PlatformHostApi().nativeHandleUrl("itms-watchs://");
await AppPlatformHostApi().nativeHandleUrl("itms-watchs://");
}
Future<void> tryApplyAndSyncWatchFace() async {
WearDeviceInfo? device;
try {
device = await WearEngineHostApi().checkConnectedDevice();
device = await AppWearEngineHostApi().checkConnectedDevice();
} catch (e) {
device = null;
}
... ... @@ -224,7 +223,8 @@ class CustomWatchThemePreviewController extends GetxController {
try {
final result = await _themeApi.applyTheme(themeId);
if (result is! AppSuccess<void>) {
syncSuccess = await WearEngineHostApi().syncWatchTheme(downloadedTheme);
syncSuccess =
await AppWearEngineHostApi().syncWatchTheme(downloadedTheme);
isApplying.value = false;
AppToast.show(l10n.watchThemeApplyFailed);
return false;
... ...
... ... @@ -6,8 +6,7 @@ import 'package:doublefeel_flutter/core/network/api/friend_api.dart';
import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/core/util/app_toast.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
... ... @@ -109,13 +108,13 @@ class WatchThemePreviewController extends GetxController {
await loadFriendTheme();
// 同时刷新好友、好友数据和好友主题
PlatformHostApi().refreshWatchAppAndWidgets();
AppPlatformHostApi().refreshWatchAppAndWidgets();
}
Future<void> addWatchFace() async {
WearDeviceInfo? device;
try {
device = await WearEngineHostApi().checkConnectedDevice();
device = await AppWearEngineHostApi().checkConnectedDevice();
} catch (e) {
device = null;
}
... ... @@ -128,17 +127,17 @@ class WatchThemePreviewController extends GetxController {
}
try {
await WearEngineHostApi().addWatchSurface();
await AppWearEngineHostApi().addWatchSurface();
} catch (e) {
// Opening the Watch app still helps the user install the watch face.
}
await PlatformHostApi().nativeHandleUrl("itms-watchs://");
await AppPlatformHostApi().nativeHandleUrl("itms-watchs://");
}
Future<void> tryApplyAndSyncWatchFace() async {
WearDeviceInfo? device;
try {
device = await WearEngineHostApi().checkConnectedDevice();
device = await AppWearEngineHostApi().checkConnectedDevice();
} catch (e) {
device = null;
}
... ... @@ -195,7 +194,8 @@ class WatchThemePreviewController extends GetxController {
try {
final result = await _themeApi.applyTheme(themeId);
if (result is! AppSuccess<void>) {
syncSuccess = await WearEngineHostApi().syncWatchTheme(downloadedTheme);
syncSuccess =
await AppWearEngineHostApi().syncWatchTheme(downloadedTheme);
isApplying.value = false;
AppToast.show(l10n.watchThemeApplyFailed);
return false;
... ...
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
extension WatchDeviceExtension on WearDeviceInfo {
String? get connectedDeviceDesc {
... ...
... ... @@ -2,7 +2,7 @@ import 'dart:io';
import 'dart:typed_data';
import 'package:doublefeel_flutter/app/modules/watch_theme/models/watch_theme_models.dart';
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/services.dart';
class WatchThemeSyncPayloadBuilder {
... ...
import 'package:doublefeel_flutter/core/network/dio_client.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
... ... @@ -14,7 +14,7 @@ class AppEnvironmentConfig {
AppEnvironmentConfig(this._storage);
final LocalStorage _storage;
final PlatformHostApi _platformHostApi = PlatformHostApi();
final AppPlatformHostApi _platformHostApi = AppPlatformHostApi();
final Rx<AppEnvironment> environment = AppEnvironment.release.obs;
... ...
import 'package:doublefeel_flutter/data/models/friend/friend_models.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import '../../constants/app_const.dart';
import '../../error/http_error_handling_policy.dart';
... ...
import '../../pigeon/platform_api.g.dart';
import '../platform/pigeon_api_facade.dart';
/// App 启动时通过 [init] 经由 Pigeon 从 native 获取完整 User-Agent 并缓存,
/// 供 [TokenInterceptor] 等拦截器同步读取。
... ... @@ -14,7 +14,7 @@ abstract final class UserAgentProvider {
/// 在 [AppBootstrap.init] 中 await,确保首次网络请求前 UA 已就绪。
static Future<void> init() async {
try {
_userAgent = await PlatformHostApi().getFullUserAgent();
_userAgent = await AppPlatformHostApi().getFullUserAgent();
} catch (_) {
// native 获取失败时保留占位值,不阻塞启动
}
... ...
import 'package:flutter/foundation.dart';
import 'package:doublefeel_flutter/pigeon/alipay_api.g.dart' as alipay;
import 'package:doublefeel_flutter/pigeon/health_kit_api.g.dart' as health_kit;
import 'package:doublefeel_flutter/pigeon/health_kit_raw_data_api.g.dart'
as health_raw;
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart' as platform;
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart' as wear;
export 'package:doublefeel_flutter/pigeon/alipay_api.g.dart';
export 'package:doublefeel_flutter/pigeon/health_kit_api.g.dart';
export 'package:doublefeel_flutter/pigeon/health_kit_raw_data_api.g.dart';
export 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
export 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
enum AppPigeonPlatform { ios, android, ohos }
typedef AppPigeonPlatformProvider = AppPigeonPlatform Function();
AppPigeonPlatform resolveAppPigeonPlatform({TargetPlatform? targetPlatform}) {
final platform = targetPlatform ?? defaultTargetPlatform;
if (platform == TargetPlatform.ohos) {
return AppPigeonPlatform.ohos;
}
if (platform == TargetPlatform.iOS) {
return AppPigeonPlatform.ios;
}
return AppPigeonPlatform.android;
}
abstract class _AppPigeonApiFacade {
_AppPigeonApiFacade({
AppPigeonPlatform? appPlatform,
AppPigeonPlatformProvider? platformProvider,
}) : _platformProvider = platformProvider ??
(() => appPlatform ?? resolveAppPigeonPlatform());
final AppPigeonPlatformProvider _platformProvider;
AppPigeonPlatform get appPigeonPlatform => _platformProvider();
Future<T> dispatch<T>({
required Future<T> Function() ios,
Future<T> Function()? android,
Future<T> Function()? ohos,
}) {
return switch (appPigeonPlatform) {
AppPigeonPlatform.ios => ios(),
AppPigeonPlatform.android => (android ?? ios)(),
AppPigeonPlatform.ohos => (ohos ?? android ?? ios)(),
};
}
}
class AppPlatformHostApi extends _AppPigeonApiFacade {
AppPlatformHostApi({
platform.PlatformHostApi? api,
super.appPlatform,
super.platformProvider,
}) : _api = api ?? platform.PlatformHostApi();
final platform.PlatformHostApi _api;
Future<String> getFullUserAgent() =>
dispatch(ios: () => _api.getFullUserAgent());
Future<bool> isChinaRegion() => dispatch(
ios: () => _api.isChinaRegion(),
ohos: () async {
return true;
});
Future<int> getApnsAuthStatus() =>
dispatch(ios: () => _api.getApnsAuthStatus());
Future<bool> requestNotificationAuth() =>
dispatch(ios: () => _api.requestNotificationAuth());
Future<bool> isDebugEnvoriment() => dispatch(
ios: () => _api.isDebugEnvoriment(),
ohos: () async {
return false;
});
Future<bool> shareText(String text) =>
dispatch(ios: () => _api.shareText(text));
Future<bool> shareFileData(Uint8List databytes) =>
dispatch(ios: () => _api.shareFileData(databytes));
Future<void> updateLoginInfo(String jsonString, String baseUrl) =>
dispatch(ios: () => _api.updateLoginInfo(jsonString, baseUrl));
Future<void> logout() => dispatch(ios: () => _api.logout());
Future<void> refreshVip() => dispatch(ios: () => _api.refreshVip());
Future<void> refreshWatchAppAndWidgets() =>
dispatch(ios: () => _api.refreshWatchAppAndWidgets());
Future<bool> requestAppReview() =>
dispatch(ios: () => _api.requestAppReview());
Future<bool> jumpAppSetting() => dispatch(ios: () => _api.jumpAppSetting());
Future<bool> nativeHandleUrl(String urlString) =>
dispatch(ios: () => _api.nativeHandleUrl(urlString));
Future<String?> requestUnhandedUrl() =>
dispatch(ios: () => _api.requestUnhandedUrl());
Future<platform.AppleSignInModel?> requestAppleSignIn() =>
dispatch(ios: () => _api.requestAppleSignIn());
Future<platform.GoogleSignInModel?> requestGoogleSignIn() =>
dispatch(ios: () => _api.requestGoogleSignIn());
Future<bool> sendEmail(String mailTo, String title, String content) =>
dispatch(ios: () => _api.sendEmail(mailTo, title, content));
Future<platform.AppleProductInfo?> requestAppleProductInfo(
String productId,
int baseUnit,
) =>
dispatch(ios: () => _api.requestAppleProductInfo(productId, baseUnit));
Future<platform.AppleProductPaymentResult?> performApplePayment(
String productId,
String uuid,
) =>
dispatch(ios: () => _api.performApplePayment(productId, uuid));
Future<bool> performRestore() => dispatch(ios: () => _api.performRestore());
Future<String?> uploadFile(
String filePath,
platform.HResourceType resourceType,
) =>
dispatch(ios: () => _api.uploadFile(filePath, resourceType));
Future<String?> performCropImage(
String imageUrl,
int? maxKB,
int? width,
int? height,
) =>
dispatch(
ios: () => _api.performCropImage(imageUrl, maxKB, width, height));
Future<bool> sendLocalNotification(
int dataType,
int dateTime,
String title,
String content,
String link,
) =>
dispatch(
ios: () => _api.sendLocalNotification(
dataType, dateTime, title, content, link),
);
}
class AppHealthKitHostApi extends _AppPigeonApiFacade {
AppHealthKitHostApi({
health_kit.HealthKitHostApi? api,
super.appPlatform,
super.platformProvider,
}) : _api = api ?? health_kit.HealthKitHostApi();
final health_kit.HealthKitHostApi _api;
Future<String> getHealthServerAuthUrl() =>
dispatch(ios: () => _api.getHealthServerAuthUrl());
Future<bool> cancelHealthAppAuthorization() =>
dispatch(ios: () => _api.cancelHealthAppAuthorization());
Future<health_kit.HealthAuthorization> checkHealthAppAuthorization() =>
dispatch(ios: () => _api.checkHealthAppAuthorization());
Future<bool> requestHealthClientAuthorization() =>
dispatch(ios: () => _api.requestHealthClientAuthorization());
}
class AppHealthKitRawDataHostApi extends _AppPigeonApiFacade {
AppHealthKitRawDataHostApi({
health_raw.HealthKitRawDataHostApi? api,
super.appPlatform,
super.platformProvider,
}) : _api = api ?? health_raw.HealthKitRawDataHostApi();
final health_raw.HealthKitRawDataHostApi _api;
Future<bool> hasHealthData() => dispatch(ios: () => _api.hasHealthData());
Future<List<health_raw.HealthKitRawDataPoint>> getHealthKitRawData(
int dataType,
int startTime,
int endTime,
) =>
dispatch(
ios: () => _api.getHealthKitRawData(dataType, startTime, endTime),
);
Future<bool> performHealthDataUpload() =>
dispatch(ios: () => _api.performHealthDataUpload());
Future<bool> syncDatabase({
required String hrDataPath,
required String hrvDataPath,
required String sleepDataPath,
required String avgRealtimeStressDataPath,
}) =>
dispatch(
ios: () => _api.syncDatabase(
hrDataPath: hrDataPath,
hrvDataPath: hrvDataPath,
sleepDataPath: sleepDataPath,
avgRealtimeStressDataPath: avgRealtimeStressDataPath,
),
);
Future<int> performHRDataUpload({required String sqliteFilePath}) => dispatch(
ios: () => _api.performHRDataUpload(sqliteFilePath: sqliteFilePath),
);
Future<int> performHRVDataUpload({required String sqliteFilePath}) =>
dispatch(
ios: () => _api.performHRVDataUpload(sqliteFilePath: sqliteFilePath),
);
Future<int> performSleepAnalysisDataUpload(
{required String sqliteFilePath}) =>
dispatch(
ios: () => _api.performSleepAnalysisDataUpload(
sqliteFilePath: sqliteFilePath,
),
);
Future<int> performAvgRealtimeStressDataUpload({
required String sqliteFilePath,
}) =>
dispatch(
ios: () => _api.performAvgRealtimeStressDataUpload(
sqliteFilePath: sqliteFilePath,
),
);
Future<List<health_raw.HealthKitRawSleepDataPoint>> getHealthKitRawSleepData(
int startTime,
int endTime,
) =>
dispatch(ios: () => _api.getHealthKitRawSleepData(startTime, endTime));
Future<List<health_raw.HealthKitRawActivityDataPoint>>
getHealthKitRawActivityData(
int startTime,
int endTime,
) =>
dispatch(
ios: () => _api.getHealthKitRawActivityData(startTime, endTime),
);
Future<List<health_raw.HealthKitRawWorkoutDataPoint>>
getHealthKitRawWorkoutData(
int startTime,
int endTime,
) =>
dispatch(
ios: () => _api.getHealthKitRawWorkoutData(startTime, endTime),
);
Future<bool> saveNativeCallFlutterChange({
required List<int> relativeDataTypes,
}) =>
dispatch(
ios: () => _api.saveNativeCallFlutterChange(
relativeDataTypes: relativeDataTypes,
),
);
Future<bool> saveFlutterCaculateFinished({
required List<int> relativeDataTypes,
}) =>
dispatch(
ios: () => _api.saveFlutterCaculateFinished(
relativeDataTypes: relativeDataTypes,
),
);
Future<bool> saveLocalNotificationRecord({
required String notificationType,
required int timestamp,
}) =>
dispatch(
ios: () => _api.saveLocalNotificationRecord(
notificationType: notificationType,
timestamp: timestamp,
),
);
Future<bool> shareNativeAppleHealthObserverRecord() =>
dispatch(ios: () => _api.shareNativeAppleHealthObserverRecord());
Future<bool> saveLocalNotificationDebugEvent({
required Map<String, Object?> event,
}) =>
dispatch(ios: () => _api.saveLocalNotificationDebugEvent(event: event));
Future<bool> shareFlutterObserverRecord() =>
dispatch(ios: () => _api.shareFlutterObserverRecord());
Future<bool> shareLocalNotificationDebugRecord() =>
dispatch(ios: () => _api.shareLocalNotificationDebugRecord());
Future<bool> shareUploadTaskRecord() =>
dispatch(ios: () => _api.shareUploadTaskRecord());
}
class AppWearEngineHostApi extends _AppPigeonApiFacade {
AppWearEngineHostApi({
wear.WearEngineHostApi? api,
super.appPlatform,
super.platformProvider,
}) : _api = api ?? wear.WearEngineHostApi();
final wear.WearEngineHostApi _api;
Future<bool> hasAvailableDevices() =>
dispatch(ios: () => _api.hasAvailableDevices());
Future<wear.WearDeviceInfo?> checkConnectedDevice() =>
dispatch(ios: () => _api.checkConnectedDevice());
Future<bool> registerMessageReceiver() =>
dispatch(ios: () => _api.registerMessageReceiver());
Future<bool> sendTextMessage(String message) =>
dispatch(ios: () => _api.sendTextMessage(message));
Future<bool> addWatchSurface() => dispatch(ios: () => _api.addWatchSurface());
Future<bool> syncWatchTheme(wear.WatchTransformTheme? theme) =>
dispatch(ios: () => _api.syncWatchTheme(theme));
Future<String?> removeBackground(String originImagePath) =>
dispatch(ios: () => _api.removeBackground(originImagePath));
Future<bool> hasInstalledWatchSurface() =>
dispatch(ios: () => _api.hasInstalledWatchSurface());
}
class AppAlipayHostApi extends _AppPigeonApiFacade {
AppAlipayHostApi({
alipay.AlipayHostApi? api,
super.appPlatform,
super.platformProvider,
}) : _api = api ?? alipay.AlipayHostApi();
final alipay.AlipayHostApi _api;
Future<alipay.AliPayResultCode> launchAliPay(String prepayData) =>
dispatch(ios: () => _api.launchAliPay(prepayData));
}
... ...
import 'package:flutter/foundation.dart';
import '../../../pigeon/health_kit_raw_data_api.g.dart';
import '../../platform/pigeon_api_facade.dart';
import 'platform_ohos/ohos_health_raw_data_sync_service.dart';
abstract class HealthRawDataSource {
... ... @@ -89,9 +89,9 @@ class PlatformHealthRawDataSource implements HealthRawDataSource {
class AppleHealthRawDataSource implements HealthRawDataSource {
AppleHealthRawDataSource({
HealthKitRawDataHostApi? rawDataApi,
}) : _rawDataApi = rawDataApi ?? HealthKitRawDataHostApi();
}) : _rawDataApi = AppHealthKitRawDataHostApi(api: rawDataApi);
final HealthKitRawDataHostApi _rawDataApi;
final AppHealthKitRawDataHostApi _rawDataApi;
@override
Future<bool> hasHealthData() {
... ...
... ... @@ -10,8 +10,7 @@ import 'package:sqflite/sqflite.dart';
import '../../../../data/models/enums/app_enums.dart';
import '../../../../l10n/l10n_extensions.dart';
import '../../../../pigeon/health_kit_api.g.dart';
import '../../../../pigeon/health_kit_raw_data_api.g.dart';
import '../../../platform/pigeon_api_facade.dart';
import '../../../config/app_environment_config.dart';
import '../../../logging/app_logger.dart';
import '../../../network/api/health_api.dart';
... ... @@ -36,8 +35,8 @@ class AppleHealthRawDataCoreService {
HealthRawLocalNotificationDispatcher? localNotificationDispatcher,
HealthRawLocalNotificationDebugStore? localNotificationDebugStore,
HealthApi? serverHealthApi,
}) : _healthApi = healthApi ?? HealthKitHostApi(),
_rawDataApi = rawDataApi ?? HealthKitRawDataHostApi(),
}) : _healthApi = AppHealthKitHostApi(api: healthApi),
_rawDataApi = AppHealthKitRawDataHostApi(api: rawDataApi),
_localStore = localStore ?? HealthRawStressLocalStore(),
_environmentConfig = environmentConfig,
_userIdProvider = userIdProvider,
... ... @@ -48,8 +47,8 @@ class AppleHealthRawDataCoreService {
HealthRawLocalNotificationDebugStore(),
_serverHealthApi = serverHealthApi;
final HealthKitHostApi _healthApi;
final HealthKitRawDataHostApi _rawDataApi;
final AppHealthKitHostApi _healthApi;
final AppHealthKitRawDataHostApi _rawDataApi;
final HealthRawStressLocalStore _localStore;
final AppEnvironmentConfig? _environmentConfig;
final int Function()? _userIdProvider;
... ...
... ... @@ -4,7 +4,7 @@ import 'dart:io';
import 'package:path_provider/path_provider.dart';
import '../../../../l10n/gen/app_localizations.dart';
import '../../../../pigeon/platform_api.g.dart';
import '../../../platform/pigeon_api_facade.dart';
import '../health_raw_models.dart';
const healthRawTodayLink = 'doublefeel://flutter/home?tab=today';
... ... @@ -227,12 +227,12 @@ class HealthRawLocalNotificationBuilder {
class HealthRawLocalNotificationDispatcher {
HealthRawLocalNotificationDispatcher({
PlatformHostApi? platformApi,
AppPlatformHostApi? platformApi,
HealthRawLocalNotificationRecordStore? recordStore,
}) : _platformApi = platformApi ?? PlatformHostApi(),
}) : _platformApi = platformApi ?? AppPlatformHostApi(),
_recordStore = recordStore ?? HealthRawLocalNotificationRecordStore();
final PlatformHostApi _platformApi;
final AppPlatformHostApi _platformApi;
final HealthRawLocalNotificationRecordStore _recordStore;
Future<List<HealthRawLocalNotification>> sendAll({
... ...
import 'package:doublefeel_flutter/core/config/app_environment_config.dart';
import 'package:doublefeel_flutter/core/services/raw_data_service/health_raw_data_core_service.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import '../logging/app_logger.dart';
import '../network/api/user_api.dart';
... ... @@ -57,7 +57,7 @@ class UserStateService {
}
await _userPrefs.clear();
try {
await PlatformHostApi().logout();
await AppPlatformHostApi().logout();
} catch (e) {
AppLogger.w('Platform logout failed', e);
}
... ... @@ -97,7 +97,6 @@ class UserStateService {
? 'mainland'
: 'overseas';
if (props.isNotEmpty) {
_thinkingDataService.setSuperProperties(props);
}
... ...
... ... @@ -8,7 +8,7 @@ import 'package:doublefeel_flutter/data/models/health/health_v2_models.dart';
import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart';
import 'package:doublefeel_flutter/data/models/health/sleep/sleep_statistics_data.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/pigeon/health_kit_raw_data_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
class LocalHealthDataConvert {
const LocalHealthDataConvert._();
... ...
... ... @@ -7,7 +7,7 @@ import 'package:doublefeel_flutter/data/models/health/activity/activity_burn_sta
import 'package:doublefeel_flutter/data/models/health/health_v2_models.dart';
import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart';
import 'package:doublefeel_flutter/data/models/health/sleep/sleep_statistics_data.dart';
import 'package:doublefeel_flutter/pigeon/health_kit_raw_data_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'health_datasource.dart';
import 'health_local_data_convert.dart';
... ...
... ... @@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:doublefeel_flutter/core/config/app_environment_config.dart';
import 'package:doublefeel_flutter/core/services/raw_data_service/health_raw_data_core_service.dart';
import 'package:doublefeel_flutter/pigeon/platform_api.g.dart';
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
... ... @@ -53,7 +53,7 @@ class UserPreferencesStorage {
if (userInfo.accessToken.isEmpty) {
try {
if (Get.isRegistered<AppEnvironmentConfig>()) {
await PlatformHostApi().logout();
await AppPlatformHostApi().logout();
}
} on Exception {
return;
... ... @@ -63,7 +63,7 @@ class UserPreferencesStorage {
try {
if (Get.isRegistered<AppEnvironmentConfig>()) {
var env = Get.find<AppEnvironmentConfig>();
await PlatformHostApi()
await AppPlatformHostApi()
.updateLoginInfo(jsonEncode(userInfo), env.serverBaseUrl);
await _syncHealthRawDatabaseToNative();
}
... ...
... ... @@ -6,7 +6,7 @@ packages:
description:
name: _fe_analyzer_shared
sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "85.0.0"
analyzer:
... ... @@ -14,7 +14,7 @@ packages:
description:
name: analyzer
sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.7.1"
archive:
... ... @@ -22,7 +22,7 @@ packages:
description:
name: archive
sha256: ace891da0862b0e4cabbb064ee3fd87b2728b898949fdb366d83fe98342c9f19
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.2.0"
args:
... ... @@ -30,7 +30,7 @@ packages:
description:
name: args
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.7.0"
async:
... ... @@ -38,7 +38,7 @@ packages:
description:
name: async
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.13.1"
boolean_selector:
... ... @@ -46,7 +46,7 @@ packages:
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.2"
build:
... ... @@ -54,7 +54,7 @@ packages:
description:
name: build
sha256: "825fed4d63050252a0b6e74f2d75844c4a85b664814be6993bd3493fb5239779"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.1"
build_config:
... ... @@ -62,7 +62,7 @@ packages:
description:
name: build_config
sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
build_daemon:
... ... @@ -70,7 +70,7 @@ packages:
description:
name: build_daemon
sha256: fd754058c342243718d5171a95f352cfc9fcf0cba8cfa26df67cb13a5836db78
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.2"
build_runner:
... ... @@ -78,7 +78,7 @@ packages:
description:
name: build_runner
sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.9.0"
built_collection:
... ... @@ -86,7 +86,7 @@ packages:
description:
name: built_collection
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.1.1"
built_value:
... ... @@ -94,7 +94,7 @@ packages:
description:
name: built_value
sha256: "31b24be6615ec7fcf70b3aa5a7469fe35826485e639a16dd7eb83ba30e4cc6a8"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "8.12.7"
cached_network_image:
... ... @@ -102,7 +102,7 @@ packages:
description:
name: cached_network_image
sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.1"
cached_network_image_platform_interface:
... ... @@ -110,7 +110,7 @@ packages:
description:
name: cached_network_image_platform_interface
sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.1"
cached_network_image_web:
... ... @@ -118,7 +118,7 @@ packages:
description:
name: cached_network_image_web
sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
characters:
... ... @@ -126,7 +126,7 @@ packages:
description:
name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.0"
checked_yaml:
... ... @@ -134,7 +134,7 @@ packages:
description:
name: checked_yaml
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.4"
clock:
... ... @@ -142,7 +142,7 @@ packages:
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.2"
code_assets:
... ... @@ -150,7 +150,7 @@ packages:
description:
name: code_assets
sha256: cfd4f5f575a49c5f10ca856e9846073f1e6c3ee94912377eea5f6cefc5272941
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
code_builder:
... ... @@ -158,7 +158,7 @@ packages:
description:
name: code_builder
sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.11.1"
collection:
... ... @@ -166,7 +166,7 @@ packages:
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.19.1"
convert:
... ... @@ -174,7 +174,7 @@ packages:
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
cross_file:
... ... @@ -182,7 +182,7 @@ packages:
description:
name: cross_file
sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.5+4"
crypto:
... ... @@ -190,7 +190,7 @@ packages:
description:
name: crypto
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.7"
cupertino_icons:
... ... @@ -198,7 +198,7 @@ packages:
description:
name: cupertino_icons
sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.9"
dart_style:
... ... @@ -206,7 +206,7 @@ packages:
description:
name: dart_style
sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.1"
dio:
... ... @@ -214,7 +214,7 @@ packages:
description:
name: dio
sha256: "0df44ebba85e503958eb75d07eedd3c86275a58c1d3eda2f2ce8f0a2c3abbb3c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.11.0"
dio_web_adapter:
... ... @@ -222,7 +222,7 @@ packages:
description:
name: dio_web_adapter
sha256: "0786d0b7295a373de356fc0af4f6f1d0ab2844ed31b19dfc5e7556b70e24212c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
equatable:
... ... @@ -230,7 +230,7 @@ packages:
description:
name: equatable
sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
fake_async:
... ... @@ -238,7 +238,7 @@ packages:
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.3"
ffi:
... ... @@ -246,7 +246,7 @@ packages:
description:
name: ffi
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
file:
... ... @@ -254,7 +254,7 @@ packages:
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.1"
file_selector_linux:
... ... @@ -262,7 +262,7 @@ packages:
description:
name: file_selector_linux
sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.4"
file_selector_macos:
... ... @@ -270,7 +270,7 @@ packages:
description:
name: file_selector_macos
sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.5"
file_selector_platform_interface:
... ... @@ -278,7 +278,7 @@ packages:
description:
name: file_selector_platform_interface
sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.7.0"
file_selector_windows:
... ... @@ -286,7 +286,7 @@ packages:
description:
name: file_selector_windows
sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.3+5"
fixnum:
... ... @@ -294,7 +294,7 @@ packages:
description:
name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
fl_chart:
... ... @@ -302,7 +302,7 @@ packages:
description:
name: fl_chart
sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.70.2"
flutter:
... ... @@ -315,7 +315,7 @@ packages:
description:
name: flutter_cache_manager
sha256: "1de7849213b4c73c85aca7e0ac687a9a5d82ccdb594366b9dcc26cb6a2189cd2"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.2"
flutter_lints:
... ... @@ -323,7 +323,7 @@ packages:
description:
name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.0.0"
flutter_localizations:
... ... @@ -336,7 +336,7 @@ packages:
description:
name: flutter_plugin_android_lifecycle
sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.35"
flutter_test:
... ... @@ -349,7 +349,7 @@ packages:
description:
name: flutter_timezone
sha256: "869677426fde92dbe170fb7d2d4929f2a8343c2f5f62f08b0bb64f908630b073"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.1.0"
flutter_web_plugins:
... ... @@ -362,7 +362,7 @@ packages:
description:
name: fluttertoast
sha256: "90778fe0497fe3a09166e8cf2e0867310ff434b794526589e77ec03cf08ba8e8"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "8.2.14"
get:
... ... @@ -370,7 +370,7 @@ packages:
description:
name: get
sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.7.3"
glob:
... ... @@ -378,7 +378,7 @@ packages:
description:
name: glob
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.3"
graphs:
... ... @@ -386,7 +386,7 @@ packages:
description:
name: graphs
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.2"
hooks:
... ... @@ -394,7 +394,7 @@ packages:
description:
name: hooks
sha256: eaac480a35ec0814146c2c48d96aaa829e0e44a7662c88ae84c9edf4bc35651f
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
http:
... ... @@ -402,7 +402,7 @@ packages:
description:
name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.6.0"
http_multi_server:
... ... @@ -410,7 +410,7 @@ packages:
description:
name: http_multi_server
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.2"
http_parser:
... ... @@ -418,7 +418,7 @@ packages:
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.2"
image_cropper:
... ... @@ -426,7 +426,7 @@ packages:
description:
name: image_cropper
sha256: "4e9c96c029eb5a23798da1b6af39787f964da6ffc78fd8447c140542a9f7c6fc"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.1.0"
image_cropper_for_web:
... ... @@ -434,7 +434,7 @@ packages:
description:
name: image_cropper_for_web
sha256: fd81ebe36f636576094377aab32673c4e5d1609b32dec16fad98d2b71f1250a9
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.1.0"
image_cropper_platform_interface:
... ... @@ -442,7 +442,7 @@ packages:
description:
name: image_cropper_platform_interface
sha256: "6ca6b81769abff9a4dcc3bbd3d75f5dfa9de6b870ae9613c8cd237333a4283af"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.1.0"
image_picker:
... ... @@ -450,7 +450,7 @@ packages:
description:
name: image_picker
sha256: d8402284df184bc05f4a2210c6c23983b0720f4cd87cbd05c5390a78af602667
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.3"
image_picker_android:
... ... @@ -458,7 +458,7 @@ packages:
description:
name: image_picker_android
sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.8.13+17"
image_picker_for_web:
... ... @@ -466,7 +466,7 @@ packages:
description:
name: image_picker_for_web
sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.1"
image_picker_ios:
... ... @@ -474,7 +474,7 @@ packages:
description:
name: image_picker_ios
sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.8.13+6"
image_picker_linux:
... ... @@ -482,7 +482,7 @@ packages:
description:
name: image_picker_linux
sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
image_picker_macos:
... ... @@ -490,7 +490,7 @@ packages:
description:
name: image_picker_macos
sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2+1"
image_picker_ohos:
... ... @@ -507,7 +507,7 @@ packages:
description:
name: image_picker_platform_interface
sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.11.1"
image_picker_windows:
... ... @@ -515,7 +515,7 @@ packages:
description:
name: image_picker_windows
sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
intl:
... ... @@ -523,7 +523,7 @@ packages:
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.20.2"
io:
... ... @@ -531,7 +531,7 @@ packages:
description:
name: io
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.5"
jni:
... ... @@ -539,7 +539,7 @@ packages:
description:
name: jni
sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
jni_flutter:
... ... @@ -547,7 +547,7 @@ packages:
description:
name: jni_flutter
sha256: "7b717011ea40d04fd47c2731d3d1d36eb99eba3435c2753d62489e8c3c9991d5"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.2"
jni_util:
... ... @@ -555,7 +555,7 @@ packages:
description:
name: jni_util
sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
json_annotation:
... ... @@ -563,7 +563,7 @@ packages:
description:
name: json_annotation
sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.12.0"
leak_tracker:
... ... @@ -571,7 +571,7 @@ packages:
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "11.0.2"
leak_tracker_flutter_testing:
... ... @@ -579,7 +579,7 @@ packages:
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.10"
leak_tracker_testing:
... ... @@ -587,7 +587,7 @@ packages:
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.2"
lints:
... ... @@ -595,7 +595,7 @@ packages:
description:
name: lints
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.1.1"
logger:
... ... @@ -603,7 +603,7 @@ packages:
description:
name: logger
sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.7.0"
logging:
... ... @@ -611,7 +611,7 @@ packages:
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
lottie:
... ... @@ -619,7 +619,7 @@ packages:
description:
name: lottie
sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.3.1"
matcher:
... ... @@ -627,7 +627,7 @@ packages:
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.17"
material_color_utilities:
... ... @@ -635,7 +635,7 @@ packages:
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.11.1"
meta:
... ... @@ -643,7 +643,7 @@ packages:
description:
name: meta
sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.19.0"
mime:
... ... @@ -651,7 +651,7 @@ packages:
description:
name: mime
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
objective_c:
... ... @@ -659,7 +659,7 @@ packages:
description:
name: objective_c
sha256: ad56fd53a78ff6b1472fa59ff2a4e8b8ccabafc586fc263a1dfad0b99b5553e3
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.6.0"
octo_image:
... ... @@ -667,7 +667,7 @@ packages:
description:
name: octo_image
sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
package_config:
... ... @@ -675,7 +675,7 @@ packages:
description:
name: package_config
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
path:
... ... @@ -683,7 +683,7 @@ packages:
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.1"
path_provider:
... ... @@ -691,7 +691,7 @@ packages:
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.5"
path_provider_android:
... ... @@ -699,7 +699,7 @@ packages:
description:
name: path_provider_android
sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.1"
path_provider_foundation:
... ... @@ -707,7 +707,7 @@ packages:
description:
name: path_provider_foundation
sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.6.0"
path_provider_linux:
... ... @@ -715,7 +715,7 @@ packages:
description:
name: path_provider_linux
sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.2"
path_provider_platform_interface:
... ... @@ -723,7 +723,7 @@ packages:
description:
name: path_provider_platform_interface
sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.3"
path_provider_windows:
... ... @@ -731,7 +731,7 @@ packages:
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.0"
permission_handler:
... ... @@ -739,7 +739,7 @@ packages:
description:
name: permission_handler
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "11.4.0"
permission_handler_android:
... ... @@ -747,7 +747,7 @@ packages:
description:
name: permission_handler_android
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "12.1.0"
permission_handler_apple:
... ... @@ -755,7 +755,7 @@ packages:
description:
name: permission_handler_apple
sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.6.1"
permission_handler_html:
... ... @@ -763,7 +763,7 @@ packages:
description:
name: permission_handler_html
sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.4+1"
permission_handler_ohos:
... ... @@ -780,7 +780,7 @@ packages:
description:
name: permission_handler_platform_interface
sha256: a5c8a97ecf5616112a5b16d4b8e9ec0e5ae90ef63ac69c0d7b8ae240be760b23
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.4.0"
permission_handler_windows:
... ... @@ -788,7 +788,7 @@ packages:
description:
name: permission_handler_windows
sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
pigeon:
... ... @@ -805,7 +805,7 @@ packages:
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.6"
plugin_platform_interface:
... ... @@ -813,7 +813,7 @@ packages:
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.8"
pool:
... ... @@ -821,7 +821,7 @@ packages:
description:
name: pool
sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.2"
posix:
... ... @@ -829,7 +829,7 @@ packages:
description:
name: posix
sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.5.2"
pretty_dio_logger:
... ... @@ -837,7 +837,7 @@ packages:
description:
name: pretty_dio_logger
sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.0"
pub_semver:
... ... @@ -845,7 +845,7 @@ packages:
description:
name: pub_semver
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
pubspec_parse:
... ... @@ -853,7 +853,7 @@ packages:
description:
name: pubspec_parse
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.0"
record_use:
... ... @@ -861,7 +861,7 @@ packages:
description:
name: record_use
sha256: "1cb8564af8d43b464294411db9217f5ec04891c6f22ee2c32d73ae05e88a6bd2"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
rxdart:
... ... @@ -869,7 +869,7 @@ packages:
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.28.0"
share_plus:
... ... @@ -904,7 +904,7 @@ packages:
description:
name: shared_preferences_android
sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.23"
shared_preferences_foundation:
... ... @@ -912,7 +912,7 @@ packages:
description:
name: shared_preferences_foundation
sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.6"
shared_preferences_linux:
... ... @@ -920,7 +920,7 @@ packages:
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.1"
shared_preferences_ohos:
... ... @@ -937,7 +937,7 @@ packages:
description:
name: shared_preferences_platform_interface
sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.2"
shared_preferences_web:
... ... @@ -945,7 +945,7 @@ packages:
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.3"
shared_preferences_windows:
... ... @@ -953,7 +953,7 @@ packages:
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.1"
shelf:
... ... @@ -961,7 +961,7 @@ packages:
description:
name: shelf
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.2"
shelf_web_socket:
... ... @@ -969,7 +969,7 @@ packages:
description:
name: shelf_web_socket
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.0"
simple_gesture_detector:
... ... @@ -977,7 +977,7 @@ packages:
description:
name: simple_gesture_detector
sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.1"
sky_engine:
... ... @@ -990,7 +990,7 @@ packages:
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.2"
sqflite:
... ... @@ -1007,7 +1007,7 @@ packages:
description:
name: sqflite_android
sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.2+3"
sqflite_common:
... ... @@ -1015,7 +1015,7 @@ packages:
description:
name: sqflite_common
sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.8"
sqflite_darwin:
... ... @@ -1023,7 +1023,7 @@ packages:
description:
name: sqflite_darwin
sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.2"
sqflite_ohos:
... ... @@ -1040,7 +1040,7 @@ packages:
description:
name: sqflite_platform_interface
sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.0"
stack_trace:
... ... @@ -1048,7 +1048,7 @@ packages:
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.12.1"
stream_channel:
... ... @@ -1056,7 +1056,7 @@ packages:
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
stream_transform:
... ... @@ -1064,7 +1064,7 @@ packages:
description:
name: stream_transform
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
string_scanner:
... ... @@ -1072,7 +1072,7 @@ packages:
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.1"
synchronized:
... ... @@ -1080,7 +1080,7 @@ packages:
description:
name: synchronized
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.0"
table_calendar:
... ... @@ -1088,7 +1088,7 @@ packages:
description:
name: table_calendar
sha256: f276347cad425ef837a41e8d9ad43f3ee7d59227aa4c36d7430607a5a18fa3b3
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.1"
term_glyph:
... ... @@ -1096,7 +1096,7 @@ packages:
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.2"
test_api:
... ... @@ -1104,7 +1104,7 @@ packages:
description:
name: test_api
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.7"
thinking_analytics:
... ... @@ -1112,7 +1112,7 @@ packages:
description:
name: thinking_analytics
sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.3.3"
typed_data:
... ... @@ -1120,7 +1120,7 @@ packages:
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.0"
url_launcher_linux:
... ... @@ -1128,7 +1128,7 @@ packages:
description:
name: url_launcher_linux
sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.2"
url_launcher_platform_interface:
... ... @@ -1136,7 +1136,7 @@ packages:
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.2"
url_launcher_web:
... ... @@ -1144,7 +1144,7 @@ packages:
description:
name: url_launcher_web
sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.3"
url_launcher_windows:
... ... @@ -1152,7 +1152,7 @@ packages:
description:
name: url_launcher_windows
sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.5"
uuid:
... ... @@ -1160,7 +1160,7 @@ packages:
description:
name: uuid
sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.6.0"
vector_math:
... ... @@ -1168,7 +1168,7 @@ packages:
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
video_thumbnail:
... ... @@ -1176,7 +1176,7 @@ packages:
description:
name: video_thumbnail
sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.5.6"
vm_service:
... ... @@ -1184,7 +1184,7 @@ packages:
description:
name: vm_service
sha256: "5f37239c4851efcef929cea7824e76df7f2f0970aef85d66bbc430afa40e72f0"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "15.3.0"
watcher:
... ... @@ -1192,7 +1192,7 @@ packages:
description:
name: watcher
sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.1"
web:
... ... @@ -1200,7 +1200,7 @@ packages:
description:
name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
web_socket:
... ... @@ -1208,7 +1208,7 @@ packages:
description:
name: web_socket
sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
web_socket_channel:
... ... @@ -1216,7 +1216,7 @@ packages:
description:
name: web_socket_channel
sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.3"
webview_flutter:
... ... @@ -1269,7 +1269,7 @@ packages:
description:
name: win32
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.15.0"
xdg_directories:
... ... @@ -1277,7 +1277,7 @@ packages:
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
yaml:
... ... @@ -1285,7 +1285,7 @@ packages:
description:
name: yaml
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.3"
sdks:
... ...