Commit 816f8e9f7a8725689534b3e3a8cf969af1326373

Authored by 权海
1 parent 2ec326af

feat(ui):互动接入

feat(ui):移除无用图片

feat(ui):互动记录

feat(ui):互动

feat(ui):完善互动文本显示
@@ -13,6 +13,9 @@ analyzer: @@ -13,6 +13,9 @@ analyzer:
13 exclude: 13 exclude:
14 - lib/**/*.g.dart 14 - lib/**/*.g.dart
15 - lib/app/routes/app_routes.dart 15 - lib/app/routes/app_routes.dart
  16 + - build/**
  17 + - android/**
  18 + - ios/**
16 19
17 linter: 20 linter:
18 # The lint rules applied to this project can be customized in the 21 # The lint rules applied to this project can be customized in the
@@ -14,6 +14,12 @@ class SelectFriendLogic { @@ -14,6 +14,12 @@ class SelectFriendLogic {
14 final isLoading = false.obs; 14 final isLoading = false.obs;
15 final selectedIndex = (-1).obs; 15 final selectedIndex = (-1).obs;
16 16
  17 + FriendHealthData? get selectedFriend {
  18 + final index = selectedIndex.value;
  19 + if (index < 0 || index >= friends.length) return null;
  20 + return friends[index];
  21 + }
  22 +
17 Future<void> initialize() async { 23 Future<void> initialize() async {
18 if (isLoading.value) return; 24 if (isLoading.value) return;
19 isLoading.value = true; 25 isLoading.value = true;
  1 +import 'package:doublefeel_flutter/app/modules/friends/models/friend_health_data.dart';
1 import 'package:doublefeel_flutter/core/theme/app_colors.dart'; 2 import 'package:doublefeel_flutter/core/theme/app_colors.dart';
2 import 'package:doublefeel_flutter/core/util/size_extensions.dart'; 3 import 'package:doublefeel_flutter/core/util/size_extensions.dart';
3 import 'package:doublefeel_flutter/l10n/l10n_extensions.dart'; 4 import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
@@ -8,7 +9,9 @@ import '../controllers/select_friend_logic.dart'; @@ -8,7 +9,9 @@ import '../controllers/select_friend_logic.dart';
8 import '../widgets/friend_health_card.dart'; 9 import '../widgets/friend_health_card.dart';
9 10
10 class SelectFriendView extends StatefulWidget { 11 class SelectFriendView extends StatefulWidget {
11 - const SelectFriendView({super.key}); 12 + const SelectFriendView({super.key, this.buttonText, this.onConfirm});
  13 + final String? buttonText;
  14 + final VoidCallback? onConfirm;
12 15
13 @override 16 @override
14 State<SelectFriendView> createState() => _SelectFriendViewState(); 17 State<SelectFriendView> createState() => _SelectFriendViewState();
@@ -42,7 +45,10 @@ class _SelectFriendViewState extends State<SelectFriendView> { @@ -42,7 +45,10 @@ class _SelectFriendViewState extends State<SelectFriendView> {
42 children: [ 45 children: [
43 Column( 46 Column(
44 children: [ 47 children: [
45 - _SelectFriendHeader(onClose: () => Get.back<void>()), 48 + _SelectFriendHeader(
  49 + buttonText: widget.buttonText,
  50 + onClose: () => Get.back<void>(),
  51 + ),
46 Expanded( 52 Expanded(
47 child: Obx(() { 53 child: Obx(() {
48 if (_logic.isLoading.value && _logic.friends.isEmpty) { 54 if (_logic.isLoading.value && _logic.friends.isEmpty) {
@@ -86,7 +92,7 @@ class _SelectFriendViewState extends State<SelectFriendView> { @@ -86,7 +92,7 @@ class _SelectFriendViewState extends State<SelectFriendView> {
86 left: 49.dp, 92 left: 49.dp,
87 right: 49.dp, 93 right: 49.dp,
88 bottom: 36.dp + MediaQuery.viewPaddingOf(context).bottom, 94 bottom: 36.dp + MediaQuery.viewPaddingOf(context).bottom,
89 - child: _SyncButton(onTap: _syncSelectedFriend), 95 + child: _SyncButton(onTap: () => _syncSelectedFriend()),
90 ), 96 ),
91 ], 97 ],
92 ), 98 ),
@@ -94,14 +100,21 @@ class _SelectFriendViewState extends State<SelectFriendView> { @@ -94,14 +100,21 @@ class _SelectFriendViewState extends State<SelectFriendView> {
94 } 100 }
95 101
96 Future<void> _syncSelectedFriend() async { 102 Future<void> _syncSelectedFriend() async {
  103 + if (widget.onConfirm != null) {
  104 + widget.onConfirm!();
  105 + final friend = _logic.selectedFriend;
  106 + Get.back(result: friend);
  107 + return;
  108 + }
97 final selectedFriend = await _logic.syncSelectedFriendToWatchFace(); 109 final selectedFriend = await _logic.syncSelectedFriendToWatchFace();
98 Get.back(result: selectedFriend); 110 Get.back(result: selectedFriend);
99 } 111 }
100 } 112 }
101 113
102 class _SelectFriendHeader extends StatelessWidget { 114 class _SelectFriendHeader extends StatelessWidget {
103 - const _SelectFriendHeader({required this.onClose}); 115 + const _SelectFriendHeader({required this.onClose, this.buttonText});
104 116
  117 + final String? buttonText;
105 final VoidCallback onClose; 118 final VoidCallback onClose;
106 119
107 @override 120 @override
@@ -119,11 +132,7 @@ class _SelectFriendHeader extends StatelessWidget { @@ -119,11 +132,7 @@ class _SelectFriendHeader extends StatelessWidget {
119 width: 40.dp, 132 width: 40.dp,
120 height: 40.dp, 133 height: 40.dp,
121 child: const Center( 134 child: const Center(
122 - child: Icon(  
123 - Icons.close,  
124 - color: AppColors.primary,  
125 - size: 20,  
126 - ), 135 + child: Icon(Icons.close, color: AppColors.primary, size: 20),
127 ), 136 ),
128 ), 137 ),
129 ), 138 ),
@@ -131,7 +140,7 @@ class _SelectFriendHeader extends StatelessWidget { @@ -131,7 +140,7 @@ class _SelectFriendHeader extends StatelessWidget {
131 Expanded( 140 Expanded(
132 child: Center( 141 child: Center(
133 child: Text( 142 child: Text(
134 - context.l10n.friendsSelect, 143 + buttonText ?? context.l10n.friendsSelect,
135 style: const TextStyle( 144 style: const TextStyle(
136 color: AppColors.textPrimary, 145 color: AppColors.textPrimary,
137 fontSize: 16, 146 fontSize: 16,
@@ -10,11 +10,32 @@ import 'package:doublefeel_flutter/core/result/app_result.dart'; @@ -10,11 +10,32 @@ import 'package:doublefeel_flutter/core/result/app_result.dart';
10 import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart'; 10 import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
11 import 'package:doublefeel_flutter/data/models/interaction/interaction_models.dart'; 11 import 'package:doublefeel_flutter/data/models/interaction/interaction_models.dart';
12 import 'package:doublefeel_flutter/data/models/user/user_models.dart'; 12 import 'package:doublefeel_flutter/data/models/user/user_models.dart';
13 -import 'package:flutter/foundation.dart'; 13 +import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
14 import 'package:get/get.dart'; 14 import 'package:get/get.dart';
15 15
16 enum InteractAction { stick, miss, punch } 16 enum InteractAction { stick, miss, punch }
17 17
  18 +extension InteractionDataActionInteractAction on InteractionDataAction {
  19 + /// Converts the action identifier returned in interaction data to the UI
  20 + /// action used by the interaction page. Unknown server values are ignored.
  21 + InteractAction? get interactAction => switch (action?.trim().toLowerCase()) {
  22 + 'poke' || 'stick' => InteractAction.stick,
  23 + 'miss' => InteractAction.miss,
  24 + 'punch' => InteractAction.punch,
  25 + _ => null,
  26 + };
  27 +}
  28 +
  29 +extension InteractionRecordInteractAction on InteractionRecord {
  30 + /// Record payloads identify the interaction by the numeric [actionType].
  31 + InteractAction? get interactAction => switch (actionType) {
  32 + 0 => InteractAction.stick,
  33 + 1 => InteractAction.miss,
  34 + 2 => InteractAction.punch,
  35 + _ => null,
  36 + };
  37 +}
  38 +
18 extension InteractActionUi on InteractAction { 39 extension InteractActionUi on InteractAction {
19 static const animationDuration = Duration(seconds: 5); 40 static const animationDuration = Duration(seconds: 5);
20 41
@@ -33,21 +54,11 @@ extension InteractActionUi on InteractAction { @@ -33,21 +54,11 @@ extension InteractActionUi on InteractAction {
33 bool get needsVip => this != InteractAction.stick; 54 bool get needsVip => this != InteractAction.stick;
34 55
35 String get iconAsset => switch (this) { 56 String get iconAsset => switch (this) {
36 - InteractAction.stick => 'assets/images/interact/icon_stick.png',  
37 - InteractAction.miss => 'assets/images/interact/icon_miss.png',  
38 - InteractAction.punch => 'assets/images/interact/icon_punch.png',  
39 - };  
40 -  
41 - String get titleAsset => switch (this) {  
42 - InteractAction.stick => 'assets/images/interact/title_stick.png',  
43 - InteractAction.miss => 'assets/images/interact/title_miss.png',  
44 - InteractAction.punch => 'assets/images/interact/title_punch.png',  
45 - };  
46 -  
47 - String get lockedTitleAsset => switch (this) {  
48 - InteractAction.stick => 'assets/images/interact/title_stick_locked.png',  
49 - InteractAction.miss => 'assets/images/interact/title_miss_locked.png',  
50 - InteractAction.punch => 'assets/images/interact/title_punch_locked.png', 57 + InteractAction.stick =>
  58 + 'assets/images/interact/ic_friend_interact_poke.png',
  59 + InteractAction.miss => 'assets/images/interact/ic_friend_interact_miss.png',
  60 + InteractAction.punch =>
  61 + 'assets/images/interact/ic_friend_interact_punch.png',
51 }; 62 };
52 63
53 String get lottieAsset => switch (this) { 64 String get lottieAsset => switch (this) {
@@ -89,7 +100,6 @@ class InteractController extends GetxController { @@ -89,7 +100,6 @@ class InteractController extends GetxController {
89 UserInfoResponse? get partner => selectedFriend.value == null 100 UserInfoResponse? get partner => selectedFriend.value == null
90 ? _userPreferencesStorage.preferences.value.partnerUserInfo 101 ? _userPreferencesStorage.preferences.value.partnerUserInfo
91 : null; 102 : null;
92 - bool get isPaired => targetFriendUserId.value != null || partner?.id != null;  
93 bool get isInteractionLocked => 103 bool get isInteractionLocked =>
94 sendingAction.value != null || activeAction.value != null; 104 sendingAction.value != null || activeAction.value != null;
95 bool get isVip => 105 bool get isVip =>
@@ -210,17 +220,9 @@ class InteractController extends GetxController { @@ -210,17 +220,9 @@ class InteractController extends GetxController {
210 isLoading.value = false; 220 isLoading.value = false;
211 switch (result) { 221 switch (result) {
212 case AppSuccess(:final data): 222 case AppSuccess(:final data):
213 - final responseRecords = data.records ?? const <InteractionRecord>[];  
214 - records.assignAll(  
215 - kDebugMode && responseRecords.isEmpty  
216 - ? _mockRecords()  
217 - : responseRecords,  
218 - ); 223 + records.assignAll(data.records ?? const <InteractionRecord>[]);
219 case AppFailure(): 224 case AppFailure():
220 - if (kDebugMode) {  
221 - records.assignAll(_mockRecords());  
222 - }  
223 - // Keep the last successful list visible in release when a refresh fails. 225 + // Keep the last successful list visible when a refresh fails.
224 } 226 }
225 } 227 }
226 228
@@ -228,11 +230,6 @@ class InteractController extends GetxController { @@ -228,11 +230,6 @@ class InteractController extends GetxController {
228 InteractAction action, { 230 InteractAction action, {
229 InteractionDataAction? actionVariables, 231 InteractionDataAction? actionVariables,
230 }) async { 232 }) async {
231 - if (!isPaired) {  
232 - _showToast('请先绑定另一半');  
233 - Get.toNamed(AppRoutes.bindPartner);  
234 - return;  
235 - }  
236 if (action.needsVip && !isVip) { 233 if (action.needsVip && !isVip) {
237 _showToast('${action.title}为会员互动,请先开通会员'); 234 _showToast('${action.title}为会员互动,请先开通会员');
238 Get.toNamed(Routes.PURCHASE); 235 Get.toNamed(Routes.PURCHASE);
@@ -241,7 +238,6 @@ class InteractController extends GetxController { @@ -241,7 +238,6 @@ class InteractController extends GetxController {
241 if (isInteractionLocked) return; 238 if (isInteractionLocked) return;
242 final friendUserId = targetFriendUserId.value; 239 final friendUserId = targetFriendUserId.value;
243 if (friendUserId == null) { 240 if (friendUserId == null) {
244 - _showToast('未找到互动好友');  
245 return; 241 return;
246 } 242 }
247 243
@@ -269,35 +265,41 @@ class InteractController extends GetxController { @@ -269,35 +265,41 @@ class InteractController extends GetxController {
269 } 265 }
270 } 266 }
271 267
272 - String barrageText(InteractionRecord record) {  
273 - final isSelf = record.userId == me?.id;  
274 - return switch (record.actionType) {  
275 - 0 => isSelf ? '我戳Ta一下~' : 'Ta戳我一下~',  
276 - 1 => isSelf ? '我想了Ta一次~' : 'Ta想了我一次~',  
277 - 2 => isSelf ? '我打了Ta一拳~' : 'Ta打了我一拳~',  
278 - _ => isSelf ? '我发起了一次互动~' : 'Ta发起了一次互动~',  
279 - };  
280 - } 268 + String barrageText(InteractionRecord record) => record.danmuText ?? '';
281 269
282 InteractionRecordLine recordLine(InteractionRecord record) { 270 InteractionRecordLine recordLine(InteractionRecord record) {
283 - final isSelf = record.userId == me?.id;  
284 - final actor = isSelf ? '我' : friendLabel;  
285 - final target = isSelf ? friendLabel : '你';  
286 - final (verb, suffix) = switch (record.actionType) {  
287 - 0 => ('戳了戳', '~'),  
288 - 1 => ('想了', '一次~'),  
289 - 2 => ('打了', '一拳~'),  
290 - _ => ('发起了', '一次互动~'),  
291 - }; 271 + final sentByMe = _isSentByMe(record);
292 return InteractionRecordLine( 272 return InteractionRecordLine(
293 - actor: actor,  
294 - verb: verb,  
295 - target: target,  
296 - suffix: suffix,  
297 - highlightTarget: isSelf, 273 + template: l10n.interactRecordTextTemplate(
  274 + sentByMe: sentByMe,
  275 + action: record.interactAction?.name,
  276 + interactionType: record.interactionType,
  277 + ),
  278 + actor: sentByMe ? l10n.interactRecordSelf : friendInteractionName,
  279 + target: record.interactionType == 100
  280 + ? friendInteractionName
  281 + : sentByMe
  282 + ? friendInteractionName
  283 + : l10n.interactRecordYou,
  284 + actionTarget: l10n.interactRecordTargetPronoun(sentByMe),
298 ); 285 );
299 } 286 }
300 287
  288 + bool _isSentByMe(InteractionRecord record) {
  289 + final selfUserId = me?.id;
  290 + if (selfUserId == null) return false;
  291 + if (record.userId == selfUserId) return true;
  292 + if (record.friendUserId == selfUserId) return false;
  293 + return false;
  294 + }
  295 +
  296 + String get friendInteractionName {
  297 + final remark = friendRemark?.trim();
  298 + return remark == null || remark.isEmpty
  299 + ? friendName
  300 + : '$remark($friendName)';
  301 + }
  302 +
301 String recordTime(InteractionRecord record) { 303 String recordTime(InteractionRecord record) {
302 final timestamp = record.createTime; 304 final timestamp = record.createTime;
303 if (timestamp == null || timestamp <= 0) return ''; 305 if (timestamp == null || timestamp <= 0) return '';
@@ -311,57 +313,27 @@ class InteractController extends GetxController { @@ -311,57 +313,27 @@ class InteractController extends GetxController {
311 void _showToast(String message) { 313 void _showToast(String message) {
312 Get.snackbar('互动', message, snackPosition: SnackPosition.BOTTOM); 314 Get.snackbar('互动', message, snackPosition: SnackPosition.BOTTOM);
313 } 315 }
314 -  
315 - List<InteractionRecord> _mockRecords() {  
316 - final now = DateTime.now();  
317 - final meId = me?.id ?? 1;  
318 - final friendId = targetFriendUserId.value ?? 2;  
319 - const texts = <String>[  
320 - '我戳了戳Ta一下~',  
321 - 'Ta打了你一拳~',  
322 - '我想Ta了,今天也要好好照顾自己呀~',  
323 - 'Ta戳了戳你,提醒你起来活动一下。',  
324 - '我送给Ta一份今天的好心情~',  
325 - 'Ta想你了,记得给Ta一个回应。',  
326 - '我打了一拳,今天也要元气满满!',  
327 - 'Ta戳了戳你,别忘了喝水。',  
328 - '我想念Ta,晚点一起聊聊天吧。',  
329 - 'Ta送来一份鼓励:今天辛苦了!',  
330 - '我戳了戳Ta,继续加油~',  
331 - 'Ta打了一拳,是轻轻的一拳。',  
332 - '我想Ta了。',  
333 - 'Ta戳了戳你。',  
334 - '我送给Ta一个拥抱。',  
335 - ];  
336 - return List<InteractionRecord>.generate(  
337 - texts.length,  
338 - (index) => InteractionRecord(  
339 - id: index + 1,  
340 - userId: index.isEven ? meId : friendId,  
341 - actionType: index % 3,  
342 - text: texts[index],  
343 - createTime:  
344 - now  
345 - .subtract(Duration(minutes: index * 17 + 3))  
346 - .millisecondsSinceEpoch ~/  
347 - Duration.millisecondsPerSecond,  
348 - ),  
349 - );  
350 - }  
351 } 316 }
352 317
353 class InteractionRecordLine { 318 class InteractionRecordLine {
  319 + static const actorToken = '##A##';
  320 + static const targetToken = '##B##';
  321 + static const actionTargetToken = '##C##';
  322 +
354 const InteractionRecordLine({ 323 const InteractionRecordLine({
  324 + required this.template,
355 required this.actor, 325 required this.actor,
356 - required this.verb,  
357 required this.target, 326 required this.target,
358 - required this.suffix,  
359 - required this.highlightTarget, 327 + required this.actionTarget,
360 }); 328 });
361 329
  330 + final String template;
362 final String actor; 331 final String actor;
363 - final String verb;  
364 final String target; 332 final String target;
365 - final String suffix;  
366 - final bool highlightTarget; 333 + final String actionTarget;
  334 +
  335 + String get text => template
  336 + .replaceAll(actorToken, actor)
  337 + .replaceAll(targetToken, target)
  338 + .replaceAll(actionTargetToken, actionTarget);
367 } 339 }
@@ -156,68 +156,58 @@ class InteractView extends GetView<InteractController> { @@ -156,68 +156,58 @@ class InteractView extends GetView<InteractController> {
156 required bool elevated, 156 required bool elevated,
157 }) { 157 }) {
158 final isLocked = controller.isInteractionLocked; 158 final isLocked = controller.isInteractionLocked;
159 - final enabled =  
160 - !isLocked &&  
161 - controller.isPaired &&  
162 - (!action.needsVip || controller.isVip); 159 + final enabled = !isLocked && (!action.needsVip || controller.isVip);
163 final sending = controller.sendingAction.value == action; 160 final sending = controller.sendingAction.value == action;
  161 +
164 return GestureDetector( 162 return GestureDetector(
165 - onLongPress: isLocked ? null : () => _showActionSheet(context), 163 + onTap: isLocked ? null : () => controller.sendAction(action),
166 child: SizedBox( 164 child: SizedBox(
167 width: width, 165 width: width,
168 height: 112, 166 height: 112,
169 - child: Stack(  
170 - clipBehavior: Clip.none,  
171 - alignment: Alignment.topCenter,  
172 - children: [  
173 - Positioned(  
174 - top: elevated ? 34 : 49,  
175 - child: Opacity(  
176 - opacity: enabled ? 1 : .4, 167 + child: Opacity(
  168 + opacity: enabled ? 1 : .4,
  169 + child: Stack(
  170 + clipBehavior: Clip.none,
  171 + alignment: Alignment.topCenter,
  172 + children: [
  173 + Positioned(
  174 + top: elevated ? 34 : 49,
177 child: Material( 175 child: Material(
178 color: _purple, 176 color: _purple,
179 borderRadius: BorderRadius.circular(elevated ? 24 : 16), 177 borderRadius: BorderRadius.circular(elevated ? 24 : 16),
180 - child: InkWell(  
181 - onTap: sending ? null : () => controller.sendAction(action),  
182 - borderRadius: BorderRadius.circular(elevated ? 24 : 16), 178 + child: Container(
  179 + decoration: BoxDecoration(
  180 + borderRadius: BorderRadius.circular(elevated ? 24 : 16),
  181 + ),
183 child: SizedBox( 182 child: SizedBox(
184 width: width, 183 width: width,
185 height: elevated ? 78 : 56, 184 height: elevated ? 78 : 56,
186 child: Center( 185 child: Center(
187 child: sending 186 child: sending
188 - ? const SizedBox(  
189 - width: 22,  
190 - height: 22,  
191 - child: CircularProgressIndicator(  
192 - color: Colors.white,  
193 - strokeWidth: 2,  
194 - ),  
195 - ) 187 + ? null
196 : Text( 188 : Text(
197 action.title, 189 action.title,
198 style: TextStyle( 190 style: TextStyle(
199 color: Colors.white, 191 color: Colors.white,
200 - fontSize: elevated ? 20 : 14, 192 + fontSize: elevated ? 20 : 16,
201 fontWeight: FontWeight.w600, 193 fontWeight: FontWeight.w600,
202 ), 194 ),
203 - ), 195 + ).paddingOnly(top: elevated ? 24 : 16),
204 ), 196 ),
205 ), 197 ),
206 ), 198 ),
207 ), 199 ),
208 ), 200 ),
209 - ),  
210 - Positioned(  
211 - top: elevated ? 0 : 19,  
212 - child: _colorPlaceholder(  
213 - elevated ? 68 : 52,  
214 - color: enabled  
215 - ? const Color(0xffc5b0ff)  
216 - : const Color(0xffd5cfe3),  
217 - radius: elevated ? 22 : 18, 201 + Positioned(
  202 + top: elevated ? 0 : 19,
  203 + child: SizedBox(
  204 + width: elevated ? 68 : 52,
  205 + height: elevated ? 68 : 52,
  206 + child: Image.asset(action.iconAsset),
  207 + ),
218 ), 208 ),
219 - ),  
220 - ], 209 + ],
  210 + ),
221 ), 211 ),
222 ), 212 ),
223 ); 213 );
@@ -303,17 +293,7 @@ class InteractView extends GetView<InteractController> { @@ -303,17 +293,7 @@ class InteractView extends GetView<InteractController> {
303 Text.rich( 293 Text.rich(
304 TextSpan( 294 TextSpan(
305 style: bodyStyle, 295 style: bodyStyle,
306 - children: [  
307 - TextSpan(text: line.actor, style: highlightStyle),  
308 - TextSpan(text: ' ${line.verb} '),  
309 - TextSpan(  
310 - text: line.target,  
311 - style: line.highlightTarget  
312 - ? highlightStyle  
313 - : bodyStyle,  
314 - ),  
315 - TextSpan(text: line.suffix),  
316 - ], 296 + children: _recordTextSpans(line, highlightStyle),
317 ), 297 ),
318 ), 298 ),
319 const SizedBox(height: 3), 299 const SizedBox(height: 3),
@@ -333,28 +313,45 @@ class InteractView extends GetView<InteractController> { @@ -333,28 +313,45 @@ class InteractView extends GetView<InteractController> {
333 ); 313 );
334 } 314 }
335 315
336 - void _onRecordTap(InteractionRecord record) {  
337 - // TODO: open the corresponding interaction-detail page. 316 + List<InlineSpan> _recordTextSpans(
  317 + InteractionRecordLine line,
  318 + TextStyle highlightStyle,
  319 + ) {
  320 + final tokenPattern = RegExp(r'##[ABC]##');
  321 + final spans = <InlineSpan>[];
  322 + var cursor = 0;
  323 + for (final match in tokenPattern.allMatches(line.template)) {
  324 + if (match.start > cursor) {
  325 + spans.add(TextSpan(text: line.template.substring(cursor, match.start)));
  326 + }
  327 + final token = match.group(0)!;
  328 + final (text, isHighlighted) = switch (token) {
  329 + InteractionRecordLine.actorToken => (line.actor, true),
  330 + InteractionRecordLine.targetToken => (line.target, true),
  331 + InteractionRecordLine.actionTargetToken => (line.actionTarget, false),
  332 + _ => ('', false),
  333 + };
  334 + spans.add(
  335 + TextSpan(text: text, style: isHighlighted ? highlightStyle : null),
  336 + );
  337 + cursor = match.end;
  338 + }
  339 + if (cursor < line.template.length) {
  340 + spans.add(TextSpan(text: line.template.substring(cursor)));
  341 + }
  342 + return spans;
338 } 343 }
339 344
340 - Widget _colorPlaceholder(  
341 - double size, {  
342 - required Color color,  
343 - required double radius,  
344 - }) {  
345 - return Container(  
346 - width: size,  
347 - height: size,  
348 - decoration: BoxDecoration(  
349 - color: color,  
350 - borderRadius: BorderRadius.circular(radius),  
351 - ),  
352 - ); 345 + void _onRecordTap(InteractionRecord record) {
  346 + // TODO: open the corresponding interaction-detail page.
353 } 347 }
354 348
355 Future<void> _changeFriend() async { 349 Future<void> _changeFriend() async {
356 final selectedFriend = await Get.bottomSheet<FriendHealthData>( 350 final selectedFriend = await Get.bottomSheet<FriendHealthData>(
357 - SizedBox(height: Get.height * 0.9, child: const SelectFriendView()), 351 + SizedBox(
  352 + height: Get.height * 0.9,
  353 + child: SelectFriendView(buttonText: '确定', onConfirm: () => const {}),
  354 + ),
358 ignoreSafeArea: false, 355 ignoreSafeArea: false,
359 isScrollControlled: true, 356 isScrollControlled: true,
360 backgroundColor: Colors.transparent, 357 backgroundColor: Colors.transparent,
@@ -366,14 +363,6 @@ class InteractView extends GetView<InteractController> { @@ -366,14 +363,6 @@ class InteractView extends GetView<InteractController> {
366 } 363 }
367 await controller.selectFriend(selectedFriend); 364 await controller.selectFriend(selectedFriend);
368 } 365 }
369 -  
370 - void _showActionSheet(BuildContext context) {  
371 - Get.bottomSheet(  
372 - InteractActionBottomSheet(controller: controller),  
373 - isScrollControlled: true,  
374 - backgroundColor: Colors.transparent,  
375 - );  
376 - }  
377 } 366 }
378 367
379 /// Coordinates the three visual containers for one interaction. The self 368 /// Coordinates the three visual containers for one interaction. The self
@@ -683,11 +672,13 @@ class _FloatingInteractionBubblesState @@ -683,11 +672,13 @@ class _FloatingInteractionBubblesState
683 672
684 @override 673 @override
685 Widget build(BuildContext context) { 674 Widget build(BuildContext context) {
  675 + final selfUserId = widget.selfUserId;
  676 + if (selfUserId == null) return const SizedBox.shrink();
686 final selfRecords = widget.records 677 final selfRecords = widget.records
687 - .where((record) => record.userId == widget.selfUserId) 678 + .where((record) => record.userId == selfUserId)
688 .toList(growable: false); 679 .toList(growable: false);
689 final friendRecords = widget.records 680 final friendRecords = widget.records
690 - .where((record) => record.userId != widget.selfUserId) 681 + .where((record) => record.friendUserId == selfUserId)
691 .toList(growable: false); 682 .toList(growable: false);
692 return LayoutBuilder( 683 return LayoutBuilder(
693 builder: (context, constraints) => AnimatedBuilder( 684 builder: (context, constraints) => AnimatedBuilder(
@@ -766,7 +757,10 @@ class _FloatingInteractionBubblesState @@ -766,7 +757,10 @@ class _FloatingInteractionBubblesState
766 } 757 }
767 758
768 double _bubbleWidth(InteractionRecord record) { 759 double _bubbleWidth(InteractionRecord record) {
769 - const horizontalPadding = 6.0 + 28 + 5 + 10; 760 + // Keep this in sync with [_FloatingInteractionBubble]'s horizontal
  761 + // padding, icon, and spacing. The old value omitted 10px of right
  762 + // padding, so server-provided danmu text could overflow its bubble.
  763 + const horizontalContent = 6.0 + 28 + 5 + 20;
770 final textPainter = TextPainter( 764 final textPainter = TextPainter(
771 text: TextSpan( 765 text: TextSpan(
772 text: widget.recordText(record), 766 text: widget.recordText(record),
@@ -775,7 +769,7 @@ class _FloatingInteractionBubblesState @@ -775,7 +769,7 @@ class _FloatingInteractionBubblesState
775 maxLines: 1, 769 maxLines: 1,
776 textDirection: TextDirection.ltr, 770 textDirection: TextDirection.ltr,
777 )..layout(); 771 )..layout();
778 - return horizontalPadding + textPainter.width; 772 + return horizontalContent + textPainter.width + 2;
779 } 773 }
780 } 774 }
781 775
@@ -792,6 +786,7 @@ class _FloatingInteractionBubble extends StatelessWidget { @@ -792,6 +786,7 @@ class _FloatingInteractionBubble extends StatelessWidget {
792 786
793 @override 787 @override
794 Widget build(BuildContext context) { 788 Widget build(BuildContext context) {
  789 + final action = record.interactAction;
795 return Container( 790 return Container(
796 width: width, 791 width: width,
797 padding: const EdgeInsets.fromLTRB(6, 4, 20, 4), 792 padding: const EdgeInsets.fromLTRB(6, 4, 20, 4),
@@ -805,155 +800,19 @@ class _FloatingInteractionBubble extends StatelessWidget { @@ -805,155 +800,19 @@ class _FloatingInteractionBubble extends StatelessWidget {
805 SizedBox( 800 SizedBox(
806 width: 28, 801 width: 28,
807 height: 28, 802 height: 28,
808 - child: Image.asset('named_assets/interact/icon_bubble_avatar.png'), 803 + child: action == null
  804 + ? const SizedBox.shrink()
  805 + : Image.asset(action.iconAsset),
809 ), 806 ),
810 const SizedBox(width: 5), 807 const SizedBox(width: 5),
811 - Flexible(  
812 - child: Text(  
813 - recordText(record),  
814 - maxLines: 1,  
815 - overflow: TextOverflow.visible,  
816 - style: const TextStyle(color: Colors.white, fontSize: 12),  
817 - ), 808 + Text(
  809 + recordText(record),
  810 + maxLines: 1,
  811 + overflow: TextOverflow.visible,
  812 + style: const TextStyle(color: Colors.white, fontSize: 12),
818 ), 813 ),
819 ], 814 ],
820 ), 815 ),
821 ); 816 );
822 } 817 }
823 } 818 }
824 -  
825 -class InteractActionBottomSheet extends StatelessWidget {  
826 - const InteractActionBottomSheet({required this.controller, super.key});  
827 -  
828 - final InteractController controller;  
829 -  
830 - @override  
831 - Widget build(BuildContext context) {  
832 - return SafeArea(  
833 - top: false,  
834 - child: Container(  
835 - height: 331,  
836 - decoration: const BoxDecoration(  
837 - image: DecorationImage(  
838 - image: AssetImage('assets/images/interact/bottom_sheet_bg.png'),  
839 - fit: BoxFit.fill,  
840 - ),  
841 - ),  
842 - child: Stack(  
843 - children: [  
844 - Align(  
845 - alignment: const Alignment(.2, -.98),  
846 - child: Image.asset(  
847 - 'assets/images/interact/bottom_sheet_label.png',  
848 - width: 126,  
849 - ),  
850 - ),  
851 - Column(  
852 - children: [  
853 - const SizedBox(height: 18),  
854 - _sheetAvatar(),  
855 - const SizedBox(height: 13),  
856 - const Text(  
857 - '给搭子送去一份互动',  
858 - style: TextStyle(color: Color(0xff908b91), fontSize: 14),  
859 - ),  
860 - const SizedBox(height: 3),  
861 - const Text(  
862 - '想念要说出来',  
863 - style: TextStyle(  
864 - color: Color(0xff896cdc),  
865 - fontSize: 24,  
866 - fontWeight: FontWeight.w700,  
867 - ),  
868 - ),  
869 - const SizedBox(height: 24),  
870 - Obx(  
871 - () => Row(  
872 - mainAxisAlignment: MainAxisAlignment.center,  
873 - crossAxisAlignment: CrossAxisAlignment.end,  
874 - children: InteractAction.values  
875 - .map(  
876 - (action) => Padding(  
877 - padding: const EdgeInsets.symmetric(horizontal: 6),  
878 - child: _sheetButton(action),  
879 - ),  
880 - )  
881 - .toList(growable: false),  
882 - ),  
883 - ),  
884 - ],  
885 - ),  
886 - ],  
887 - ),  
888 - ),  
889 - );  
890 - }  
891 -  
892 - Widget _sheetAvatar() {  
893 - final avatar = controller.partner?.avatar;  
894 - return Container(  
895 - width: 56,  
896 - height: 56,  
897 - clipBehavior: Clip.antiAlias,  
898 - decoration: BoxDecoration(  
899 - shape: BoxShape.circle,  
900 - border: Border.all(color: const Color(0xff896cdc), width: 2),  
901 - ),  
902 - child: avatar == null || avatar.isEmpty  
903 - ? const Icon(Icons.person, color: Color(0xff908b91))  
904 - : Image.network(avatar, fit: BoxFit.cover),  
905 - );  
906 - }  
907 -  
908 - Widget _sheetButton(InteractAction action) {  
909 - final enabled =  
910 - !controller.isInteractionLocked &&  
911 - controller.isPaired &&  
912 - (!action.needsVip || controller.isVip);  
913 - final sending = controller.sendingAction.value == action;  
914 - return SizedBox(  
915 - width: action == InteractAction.stick ? 112 : 88,  
916 - height: action == InteractAction.stick ? 74 : 56,  
917 - child: ElevatedButton(  
918 - onPressed: !enabled || sending  
919 - ? null  
920 - : () async {  
921 - await controller.sendAction(  
922 - action,  
923 - actionVariables: const InteractionDataAction(objectTarget: 2),  
924 - );  
925 - if (controller.sendingAction.value == null) Get.back();  
926 - },  
927 - style: ElevatedButton.styleFrom(  
928 - padding: EdgeInsets.zero,  
929 - backgroundColor: const Color(  
930 - 0xff896cdc,  
931 - ).withValues(alpha: enabled ? 1 : .4),  
932 - shape: RoundedRectangleBorder(  
933 - borderRadius: BorderRadius.circular(28),  
934 - ),  
935 - ),  
936 - child: sending  
937 - ? const CircularProgressIndicator(  
938 - color: Colors.white,  
939 - strokeWidth: 2,  
940 - )  
941 - : Column(  
942 - mainAxisAlignment: MainAxisAlignment.center,  
943 - children: [  
944 - Image.asset(  
945 - enabled  
946 - ? action.iconAsset  
947 - : 'assets/images/interact/icon_locked.png',  
948 - height: 38,  
949 - ),  
950 - Image.asset(  
951 - enabled ? action.titleAsset : action.lockedTitleAsset,  
952 - height: 18,  
953 - ),  
954 - ],  
955 - ),  
956 - ),  
957 - );  
958 - }  
959 -}  
@@ -114,27 +114,34 @@ class InteractionRecord { @@ -114,27 +114,34 @@ class InteractionRecord {
114 this.id, 114 this.id,
115 this.createTime, 115 this.createTime,
116 this.userId, 116 this.userId,
  117 + this.friendUserId,
117 this.pairId, 118 this.pairId,
118 this.interactionType, 119 this.interactionType,
119 this.actionType, 120 this.actionType,
120 this.action, 121 this.action,
121 this.text, 122 this.text,
  123 + this.danmuText,
122 }); 124 });
123 125
124 final int? id; 126 final int? id;
125 final int? createTime; 127 final int? createTime;
  128 +
  129 + /// The interaction recipient. [userId] is the initiator.
126 final int? userId; 130 final int? userId;
  131 + final int? friendUserId;
127 final int? pairId; 132 final int? pairId;
128 final int? interactionType; 133 final int? interactionType;
129 final int? actionType; 134 final int? actionType;
130 final InteractionDataAction? action; 135 final InteractionDataAction? action;
131 final String? text; 136 final String? text;
  137 + final String? danmuText;
132 138
133 factory InteractionRecord.fromJson(Map<String, dynamic> json) { 139 factory InteractionRecord.fromJson(Map<String, dynamic> json) {
134 return InteractionRecord( 140 return InteractionRecord(
135 id: json['id'] as int?, 141 id: json['id'] as int?,
136 createTime: json['create_time'] as int?, 142 createTime: json['create_time'] as int?,
137 userId: json['user_id'] as int?, 143 userId: json['user_id'] as int?,
  144 + friendUserId: json['friend_user_id'] as int?,
138 pairId: json['pair_id'] as int?, 145 pairId: json['pair_id'] as int?,
139 interactionType: json['interaction_type'] as int?, 146 interactionType: json['interaction_type'] as int?,
140 actionType: json['action_type'] as int?, 147 actionType: json['action_type'] as int?,
@@ -144,6 +151,7 @@ class InteractionRecord { @@ -144,6 +151,7 @@ class InteractionRecord {
144 json['action_variables'] as Map<String, dynamic>, 151 json['action_variables'] as Map<String, dynamic>,
145 ), 152 ),
146 text: json['text'] as String?, 153 text: json['text'] as String?,
  154 + danmuText: json['danmu_text'] as String?,
147 ); 155 );
148 } 156 }
149 157
@@ -152,11 +160,13 @@ class InteractionRecord { @@ -152,11 +160,13 @@ class InteractionRecord {
152 if (id != null) val['id'] = id; 160 if (id != null) val['id'] = id;
153 if (createTime != null) val['create_time'] = createTime; 161 if (createTime != null) val['create_time'] = createTime;
154 if (userId != null) val['user_id'] = userId; 162 if (userId != null) val['user_id'] = userId;
  163 + if (friendUserId != null) val['friend_user_id'] = friendUserId;
155 if (pairId != null) val['pair_id'] = pairId; 164 if (pairId != null) val['pair_id'] = pairId;
156 if (interactionType != null) val['interaction_type'] = interactionType; 165 if (interactionType != null) val['interaction_type'] = interactionType;
157 if (actionType != null) val['action_type'] = actionType; 166 if (actionType != null) val['action_type'] = actionType;
158 if (action != null) val['action_variables'] = action!.toJson(); 167 if (action != null) val['action_variables'] = action!.toJson();
159 if (text != null) val['text'] = text; 168 if (text != null) val['text'] = text;
  169 + if (danmuText != null) val['danmu_text'] = danmuText;
160 return val; 170 return val;
161 } 171 }
162 } 172 }
@@ -118,6 +118,249 @@ extension InteractionAppLocalizations on AppLocalizations { @@ -118,6 +118,249 @@ extension InteractionAppLocalizations on AppLocalizations {
118 }; 118 };
119 } 119 }
120 120
  121 + String get interactRecordSelf => switch (localeName) {
  122 + 'zh' || 'zh_Hans' || 'zh_Hant' => '我',
  123 + 'ja' => '私',
  124 + 'ko' => '나',
  125 + 'de' => 'Ich',
  126 + 'es' => 'Yo',
  127 + 'fil' => 'Ako',
  128 + 'fr' => 'Je',
  129 + 'hi' => 'मैं',
  130 + 'it' => 'Io',
  131 + 'nl' => 'Ik',
  132 + 'pt' || 'pt_BR' || 'pt_PT' => 'Eu',
  133 + 'ru' => 'Я',
  134 + 'tr' => 'Ben',
  135 + _ => 'I',
  136 + };
  137 +
  138 + String get interactRecordYou => switch (localeName) {
  139 + 'zh' || 'zh_Hans' || 'zh_Hant' => '你',
  140 + 'ja' => 'あなた',
  141 + 'ko' => '너',
  142 + 'de' => 'dich',
  143 + 'es' => 'ti',
  144 + 'fil' => 'ikaw',
  145 + 'fr' => 'toi',
  146 + 'hi' => 'तुम्हें',
  147 + 'it' => 'te',
  148 + 'nl' => 'jou',
  149 + 'pt' || 'pt_BR' || 'pt_PT' => 'você',
  150 + 'ru' => 'тебя',
  151 + 'tr' => 'seni',
  152 + _ => 'you',
  153 + };
  154 +
  155 + String interactRecordTargetPronoun(bool sentByMe) {
  156 + if (!sentByMe) return interactRecordYou;
  157 + return switch (localeName) {
  158 + 'zh' || 'zh_Hans' || 'zh_Hant' => 'Ta',
  159 + 'ja' => '相手',
  160 + 'ko' => '상대',
  161 + 'de' => 'sie',
  162 + 'es' => 'esa persona',
  163 + 'fil' => 'siya',
  164 + 'fr' => 'cette personne',
  165 + 'hi' => 'उन्हें',
  166 + 'it' => 'loro',
  167 + 'nl' => 'hen',
  168 + 'pt' || 'pt_BR' || 'pt_PT' => 'essa pessoa',
  169 + 'ru' => 'его/её',
  170 + 'tr' => 'onu',
  171 + _ => 'them',
  172 + };
  173 + }
  174 +
  175 + /// Localized record text. ##A## is actor, ##B## is the highlighted target,
  176 + /// and ##C## is the plain-language action target.
  177 + String interactRecordTextTemplate({
  178 + required bool sentByMe,
  179 + required String? action,
  180 + required int? interactionType,
  181 + }) {
  182 + if (interactionType == 100) {
  183 + return _recordTemplate(
  184 + action: action,
  185 + scene: null,
  186 + sentByMe: sentByMe,
  187 + useHighlightedTarget: true,
  188 + );
  189 + }
  190 + final sceneTitle = _recordSceneTitle(interactionType);
  191 + final scene = sceneTitle == null ? null : interactSceneTitle(sceneTitle);
  192 + return _recordTemplate(action: action, scene: scene, sentByMe: sentByMe);
  193 + }
  194 +
  195 + InteractionSceneTitle? _recordSceneTitle(int? type) => switch (type) {
  196 + 100 || null => null,
  197 + 101 => InteractionSceneTitle.todayAverageHrv,
  198 + 102 => InteractionSceneTitle.todayRestingHeartRate,
  199 + 103 => InteractionSceneTitle.todaySleepStatus,
  200 + 104 => InteractionSceneTitle.todayFitnessStatus,
  201 + 105 => InteractionSceneTitle.weekStressTrend,
  202 + 106 => InteractionSceneTitle.monthStressTrend,
  203 + 107 => InteractionSceneTitle.yearStressTrend,
  204 + 108 => InteractionSceneTitle.todayActivityBurn,
  205 + 109 => InteractionSceneTitle.weekActivityBurn,
  206 + 110 => InteractionSceneTitle.monthActivityBurn,
  207 + 111 => InteractionSceneTitle.todaySleepStatus,
  208 + 112 => InteractionSceneTitle.weekSleepTime,
  209 + 113 => InteractionSceneTitle.monthSleepTime,
  210 + 114 => InteractionSceneTitle.pkSteps,
  211 + 115 => InteractionSceneTitle.pkCalories,
  212 + 116 => InteractionSceneTitle.pkStandTime,
  213 + 117 => InteractionSceneTitle.pkMonthlyResult,
  214 + _ => null,
  215 + };
  216 +
  217 + String _recordTemplate({
  218 + required String? action,
  219 + required String? scene,
  220 + required bool sentByMe,
  221 + bool useHighlightedTarget = false,
  222 + }) {
  223 + final verb = _recordActionVerb(action);
  224 + final actionSuffix = _recordActionSuffix(action);
  225 + final actionTargetToken = useHighlightedTarget ? '##B##' : '##C##';
  226 + final defaultText = switch (localeName) {
  227 + 'zh' ||
  228 + 'zh_Hans' ||
  229 + 'zh_Hant' => '##A##$verb$actionTargetToken$actionSuffix~',
  230 + 'ja' => '##A##が$actionTargetToken$verb~',
  231 + 'ko' => '##A## $actionTargetToken을(를) $verb~',
  232 + 'de' => '##A## hat $actionTargetToken $verb~',
  233 + 'es' => '##A## $verb a $actionTargetToken~',
  234 + 'fil' => '##A## ay $verb si $actionTargetToken~',
  235 + 'fr' => '##A## a $verb $actionTargetToken~',
  236 + 'hi' => '##A## ने $actionTargetToken को $verb~',
  237 + 'it' => '##A## ha $verb $actionTargetToken~',
  238 + 'nl' => '##A## heeft $actionTargetToken $verb~',
  239 + 'pt' || 'pt_BR' || 'pt_PT' => '##A## $verb $actionTargetToken~',
  240 + 'ru' => '##A## $verb $actionTargetToken~',
  241 + 'tr' => '##A## $actionTargetToken $verb~',
  242 + _ => '##A## $verb $actionTargetToken~',
  243 + };
  244 + if (scene == null) return defaultText;
  245 + return switch (localeName) {
  246 + 'zh' ||
  247 + 'zh_Hans' ||
  248 + 'zh_Hant' => '##A## 看了##B##的【$scene】,并$verb##C##$actionSuffix~',
  249 + 'ja' => '##A##が##B##の【$scene】を見て、##C##を$verb~',
  250 + 'ko' => '##A## ##B##의【$scene】을 보고 ##C##을(를) $verb~',
  251 + 'de' => '##A## hat ##B##s [$scene] angesehen und ##C## $verb~',
  252 + 'es' => '##A## vio [$scene] de ##B## y $verb a ##C##~',
  253 + 'fil' => '##A## ay tiningnan ang [$scene] ni ##B## at $verb si ##C##~',
  254 + 'fr' => '##A## a vu le [$scene] de ##B## et a $verb ##C##~',
  255 + 'hi' => '##A## ने ##B## का [$scene] देखा और ##C## को $verb~',
  256 + 'it' => '##A## ha visto [$scene] di ##B## e ha $verb ##C##~',
  257 + 'nl' => '##A## bekeek [$scene] van ##B## en heeft ##C## $verb~',
  258 + 'pt' ||
  259 + 'pt_BR' ||
  260 + 'pt_PT' => '##A## viu [$scene] de ##B## e $verb ##C##~',
  261 + 'ru' => '##A## посмотрел(а) [$scene] ##B## и $verb ##C##~',
  262 + 'tr' =>
  263 + '##A##, ##B## adlı kişinin [$scene] verisini gördü ve ##C## $verb~',
  264 + _ => '##A## viewed ##B##\'s [$scene] and $verb ##C##~',
  265 + };
  266 + }
  267 +
  268 + String _recordActionVerb(String? action) => switch (localeName) {
  269 + 'zh' || 'zh_Hans' || 'zh_Hant' => switch (action) {
  270 + 'stick' => '戳了戳',
  271 + 'miss' => '想了',
  272 + 'punch' => '打了',
  273 + _ => '互动了',
  274 + },
  275 + 'ja' => switch (action) {
  276 + 'stick' => 'つついた',
  277 + 'miss' => '会いたくなった',
  278 + 'punch' => 'パンチした',
  279 + _ => '交流した',
  280 + },
  281 + 'ko' => switch (action) {
  282 + 'stick' => '콕 찔렀다',
  283 + 'miss' => '그리워했다',
  284 + 'punch' => '주먹으로 쳤다',
  285 + _ => '상호작용했다',
  286 + },
  287 + 'de' => switch (action) {
  288 + 'stick' => 'angestupst',
  289 + 'miss' => 'vermisst',
  290 + 'punch' => 'geboxt',
  291 + _ => 'kontaktiert',
  292 + },
  293 + 'es' => switch (action) {
  294 + 'stick' => 'dio un toque',
  295 + 'miss' => 'extrañó',
  296 + 'punch' => 'golpeó',
  297 + _ => 'interactuó con',
  298 + },
  299 + 'fil' => switch (action) {
  300 + 'stick' => 'tinapik',
  301 + 'miss' => 'na-miss',
  302 + 'punch' => 'sinuntok',
  303 + _ => 'nakipag-ugnayan kay',
  304 + },
  305 + 'fr' => switch (action) {
  306 + 'stick' => 'taquiné',
  307 + 'miss' => 'manqué à',
  308 + 'punch' => 'donné un coup de poing à',
  309 + _ => 'interagi avec',
  310 + },
  311 + 'hi' => switch (action) {
  312 + 'stick' => 'हल्का धक्का दिया',
  313 + 'miss' => 'याद किया',
  314 + 'punch' => 'मुक्का मारा',
  315 + _ => 'इंटरैक्ट किया',
  316 + },
  317 + 'it' => switch (action) {
  318 + 'stick' => 'stuzzicato',
  319 + 'miss' => 'sentito la mancanza di',
  320 + 'punch' => 'dato un pugno a',
  321 + _ => 'interagito con',
  322 + },
  323 + 'nl' => switch (action) {
  324 + 'stick' => 'geprikt',
  325 + 'miss' => 'gemist',
  326 + 'punch' => 'gestoten',
  327 + _ => 'contact gehad met',
  328 + },
  329 + 'pt' || 'pt_BR' || 'pt_PT' => switch (action) {
  330 + 'stick' => 'cutucou',
  331 + 'miss' => 'sentiu saudade de',
  332 + 'punch' => 'deu um soco em',
  333 + _ => 'interagiu com',
  334 + },
  335 + 'ru' => switch (action) {
  336 + 'stick' => 'ткнул(а)',
  337 + 'miss' => 'скучал(а) по',
  338 + 'punch' => 'ударил(а)',
  339 + _ => 'взаимодействовал(а) с',
  340 + },
  341 + 'tr' => switch (action) {
  342 + 'stick' => 'dürttü',
  343 + 'miss' => 'özledi',
  344 + 'punch' => 'yumrukladı',
  345 + _ => 'etkileşime geçti',
  346 + },
  347 + _ => switch (action) {
  348 + 'stick' => 'poked',
  349 + 'miss' => 'missed',
  350 + 'punch' => 'punched',
  351 + _ => 'interacted with',
  352 + },
  353 + };
  354 +
  355 + String _recordActionSuffix(String? action) => switch (localeName) {
  356 + 'zh' || 'zh_Hans' || 'zh_Hant' => switch (action) {
  357 + 'punch' => '一拳',
  358 + 'miss' => '一次',
  359 + _ => '',
  360 + },
  361 + _ => '',
  362 + };
  363 +
121 String get interactActionSheetInvitation => _interactionStrings.$1; 364 String get interactActionSheetInvitation => _interactionStrings.$1;
122 String get interactTodaySteps => _interactionStrings.$2; 365 String get interactTodaySteps => _interactionStrings.$2;
123 String get interactStepsUnit => _interactionStrings.$3; 366 String get interactStepsUnit => _interactionStrings.$3;
@@ -6,7 +6,7 @@ packages: @@ -6,7 +6,7 @@ packages:
6 description: 6 description:
7 name: _fe_analyzer_shared 7 name: _fe_analyzer_shared
8 sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f 8 sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
9 - url: "https://pub.flutter-io.cn" 9 + url: "https://pub.dev"
10 source: hosted 10 source: hosted
11 version: "85.0.0" 11 version: "85.0.0"
12 analyzer: 12 analyzer:
@@ -14,23 +14,23 @@ packages: @@ -14,23 +14,23 @@ packages:
14 description: 14 description:
15 name: analyzer 15 name: analyzer
16 sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" 16 sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
17 - url: "https://pub.flutter-io.cn" 17 + url: "https://pub.dev"
18 source: hosted 18 source: hosted
19 version: "7.7.1" 19 version: "7.7.1"
20 archive: 20 archive:
21 dependency: transitive 21 dependency: transitive
22 description: 22 description:
23 name: archive 23 name: archive
24 - sha256: ace891da0862b0e4cabbb064ee3fd87b2728b898949fdb366d83fe98342c9f19  
25 - url: "https://pub.flutter-io.cn" 24 + sha256: "6c5bcd986e06b94e3c40244af471750840a3d2341d1f9763a1100a14add517b4"
  25 + url: "https://pub.dev"
26 source: hosted 26 source: hosted
27 - version: "4.2.0" 27 + version: "4.3.0"
28 args: 28 args:
29 dependency: transitive 29 dependency: transitive
30 description: 30 description:
31 name: args 31 name: args
32 sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 32 sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
33 - url: "https://pub.flutter-io.cn" 33 + url: "https://pub.dev"
34 source: hosted 34 source: hosted
35 version: "2.7.0" 35 version: "2.7.0"
36 async: 36 async:
@@ -38,7 +38,7 @@ packages: @@ -38,7 +38,7 @@ packages:
38 description: 38 description:
39 name: async 39 name: async
40 sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 40 sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
41 - url: "https://pub.flutter-io.cn" 41 + url: "https://pub.dev"
42 source: hosted 42 source: hosted
43 version: "2.13.1" 43 version: "2.13.1"
44 boolean_selector: 44 boolean_selector:
@@ -46,7 +46,7 @@ packages: @@ -46,7 +46,7 @@ packages:
46 description: 46 description:
47 name: boolean_selector 47 name: boolean_selector
48 sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 48 sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
49 - url: "https://pub.flutter-io.cn" 49 + url: "https://pub.dev"
50 source: hosted 50 source: hosted
51 version: "2.1.2" 51 version: "2.1.2"
52 build: 52 build:
@@ -54,7 +54,7 @@ packages: @@ -54,7 +54,7 @@ packages:
54 description: 54 description:
55 name: build 55 name: build
56 sha256: "825fed4d63050252a0b6e74f2d75844c4a85b664814be6993bd3493fb5239779" 56 sha256: "825fed4d63050252a0b6e74f2d75844c4a85b664814be6993bd3493fb5239779"
57 - url: "https://pub.flutter-io.cn" 57 + url: "https://pub.dev"
58 source: hosted 58 source: hosted
59 version: "4.0.1" 59 version: "4.0.1"
60 build_config: 60 build_config:
@@ -62,23 +62,23 @@ packages: @@ -62,23 +62,23 @@ packages:
62 description: 62 description:
63 name: build_config 63 name: build_config
64 sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" 64 sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187"
65 - url: "https://pub.flutter-io.cn" 65 + url: "https://pub.dev"
66 source: hosted 66 source: hosted
67 version: "1.2.0" 67 version: "1.2.0"
68 build_daemon: 68 build_daemon:
69 dependency: transitive 69 dependency: transitive
70 description: 70 description:
71 name: build_daemon 71 name: build_daemon
72 - sha256: e1d40ef3f7934986d5da2271b1ba07794921ce263e44d622fb6c406d76589e33  
73 - url: "https://pub.flutter-io.cn" 72 + sha256: fd754058c342243718d5171a95f352cfc9fcf0cba8cfa26df67cb13a5836db78
  73 + url: "https://pub.dev"
74 source: hosted 74 source: hosted
75 - version: "4.1.6" 75 + version: "4.1.2"
76 build_runner: 76 build_runner:
77 dependency: "direct dev" 77 dependency: "direct dev"
78 description: 78 description:
79 name: build_runner 79 name: build_runner
80 sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1" 80 sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1"
81 - url: "https://pub.flutter-io.cn" 81 + url: "https://pub.dev"
82 source: hosted 82 source: hosted
83 version: "2.9.0" 83 version: "2.9.0"
84 built_collection: 84 built_collection:
@@ -86,7 +86,7 @@ packages: @@ -86,7 +86,7 @@ packages:
86 description: 86 description:
87 name: built_collection 87 name: built_collection
88 sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" 88 sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
89 - url: "https://pub.flutter-io.cn" 89 + url: "https://pub.dev"
90 source: hosted 90 source: hosted
91 version: "5.1.1" 91 version: "5.1.1"
92 built_value: 92 built_value:
@@ -94,7 +94,7 @@ packages: @@ -94,7 +94,7 @@ packages:
94 description: 94 description:
95 name: built_value 95 name: built_value
96 sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7 96 sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7
97 - url: "https://pub.flutter-io.cn" 97 + url: "https://pub.dev"
98 source: hosted 98 source: hosted
99 version: "8.13.0" 99 version: "8.13.0"
100 cached_network_image: 100 cached_network_image:
@@ -102,7 +102,7 @@ packages: @@ -102,7 +102,7 @@ packages:
102 description: 102 description:
103 name: cached_network_image 103 name: cached_network_image
104 sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" 104 sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
105 - url: "https://pub.flutter-io.cn" 105 + url: "https://pub.dev"
106 source: hosted 106 source: hosted
107 version: "3.4.1" 107 version: "3.4.1"
108 cached_network_image_platform_interface: 108 cached_network_image_platform_interface:
@@ -110,7 +110,7 @@ packages: @@ -110,7 +110,7 @@ packages:
110 description: 110 description:
111 name: cached_network_image_platform_interface 111 name: cached_network_image_platform_interface
112 sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" 112 sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829"
113 - url: "https://pub.flutter-io.cn" 113 + url: "https://pub.dev"
114 source: hosted 114 source: hosted
115 version: "4.1.1" 115 version: "4.1.1"
116 cached_network_image_web: 116 cached_network_image_web:
@@ -118,7 +118,7 @@ packages: @@ -118,7 +118,7 @@ packages:
118 description: 118 description:
119 name: cached_network_image_web 119 name: cached_network_image_web
120 sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" 120 sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
121 - url: "https://pub.flutter-io.cn" 121 + url: "https://pub.dev"
122 source: hosted 122 source: hosted
123 version: "1.3.1" 123 version: "1.3.1"
124 characters: 124 characters:
@@ -126,7 +126,7 @@ packages: @@ -126,7 +126,7 @@ packages:
126 description: 126 description:
127 name: characters 127 name: characters
128 sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b 128 sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
129 - url: "https://pub.flutter-io.cn" 129 + url: "https://pub.dev"
130 source: hosted 130 source: hosted
131 version: "1.4.1" 131 version: "1.4.1"
132 checked_yaml: 132 checked_yaml:
@@ -134,7 +134,7 @@ packages: @@ -134,7 +134,7 @@ packages:
134 description: 134 description:
135 name: checked_yaml 135 name: checked_yaml
136 sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" 136 sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
137 - url: "https://pub.flutter-io.cn" 137 + url: "https://pub.dev"
138 source: hosted 138 source: hosted
139 version: "2.0.4" 139 version: "2.0.4"
140 clock: 140 clock:
@@ -142,7 +142,7 @@ packages: @@ -142,7 +142,7 @@ packages:
142 description: 142 description:
143 name: clock 143 name: clock
144 sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 144 sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
145 - url: "https://pub.flutter-io.cn" 145 + url: "https://pub.dev"
146 source: hosted 146 source: hosted
147 version: "1.1.2" 147 version: "1.1.2"
148 code_assets: 148 code_assets:
@@ -150,7 +150,7 @@ packages: @@ -150,7 +150,7 @@ packages:
150 description: 150 description:
151 name: code_assets 151 name: code_assets
152 sha256: cfd4f5f575a49c5f10ca856e9846073f1e6c3ee94912377eea5f6cefc5272941 152 sha256: cfd4f5f575a49c5f10ca856e9846073f1e6c3ee94912377eea5f6cefc5272941
153 - url: "https://pub.flutter-io.cn" 153 + url: "https://pub.dev"
154 source: hosted 154 source: hosted
155 version: "2.0.0" 155 version: "2.0.0"
156 code_builder: 156 code_builder:
@@ -158,7 +158,7 @@ packages: @@ -158,7 +158,7 @@ packages:
158 description: 158 description:
159 name: code_builder 159 name: code_builder
160 sha256: aa5932e94c6c39c2f9ec4e5e06dfdd11a9430a61f6c41b6ba75b28ce0c481baf 160 sha256: aa5932e94c6c39c2f9ec4e5e06dfdd11a9430a61f6c41b6ba75b28ce0c481baf
161 - url: "https://pub.flutter-io.cn" 161 + url: "https://pub.dev"
162 source: hosted 162 source: hosted
163 version: "4.12.0" 163 version: "4.12.0"
164 collection: 164 collection:
@@ -166,7 +166,7 @@ packages: @@ -166,7 +166,7 @@ packages:
166 description: 166 description:
167 name: collection 167 name: collection
168 sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 168 sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
169 - url: "https://pub.flutter-io.cn" 169 + url: "https://pub.dev"
170 source: hosted 170 source: hosted
171 version: "1.19.1" 171 version: "1.19.1"
172 convert: 172 convert:
@@ -174,7 +174,7 @@ packages: @@ -174,7 +174,7 @@ packages:
174 description: 174 description:
175 name: convert 175 name: convert
176 sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 176 sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
177 - url: "https://pub.flutter-io.cn" 177 + url: "https://pub.dev"
178 source: hosted 178 source: hosted
179 version: "3.1.2" 179 version: "3.1.2"
180 cross_file: 180 cross_file:
@@ -182,7 +182,7 @@ packages: @@ -182,7 +182,7 @@ packages:
182 description: 182 description:
183 name: cross_file 183 name: cross_file
184 sha256: f141ea4f277af142a0356955707f6556f37b03947d39d55585981a06ca437bd6 184 sha256: f141ea4f277af142a0356955707f6556f37b03947d39d55585981a06ca437bd6
185 - url: "https://pub.flutter-io.cn" 185 + url: "https://pub.dev"
186 source: hosted 186 source: hosted
187 version: "0.3.5+5" 187 version: "0.3.5+5"
188 crypto: 188 crypto:
@@ -190,7 +190,7 @@ packages: @@ -190,7 +190,7 @@ packages:
190 description: 190 description:
191 name: crypto 191 name: crypto
192 sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf 192 sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
193 - url: "https://pub.flutter-io.cn" 193 + url: "https://pub.dev"
194 source: hosted 194 source: hosted
195 version: "3.0.7" 195 version: "3.0.7"
196 cupertino_icons: 196 cupertino_icons:
@@ -198,7 +198,7 @@ packages: @@ -198,7 +198,7 @@ packages:
198 description: 198 description:
199 name: cupertino_icons 199 name: cupertino_icons
200 sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" 200 sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd"
201 - url: "https://pub.flutter-io.cn" 201 + url: "https://pub.dev"
202 source: hosted 202 source: hosted
203 version: "1.0.9" 203 version: "1.0.9"
204 dart_style: 204 dart_style:
@@ -206,7 +206,7 @@ packages: @@ -206,7 +206,7 @@ packages:
206 description: 206 description:
207 name: dart_style 207 name: dart_style
208 sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" 208 sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb"
209 - url: "https://pub.flutter-io.cn" 209 + url: "https://pub.dev"
210 source: hosted 210 source: hosted
211 version: "3.1.1" 211 version: "3.1.1"
212 dio: 212 dio:
@@ -214,7 +214,7 @@ packages: @@ -214,7 +214,7 @@ packages:
214 description: 214 description:
215 name: dio 215 name: dio
216 sha256: "852ec3b48cc431ac04fff978413c541502b67ffc3e26921e74e3d994694192c1" 216 sha256: "852ec3b48cc431ac04fff978413c541502b67ffc3e26921e74e3d994694192c1"
217 - url: "https://pub.flutter-io.cn" 217 + url: "https://pub.dev"
218 source: hosted 218 source: hosted
219 version: "5.11.1" 219 version: "5.11.1"
220 dio_web_adapter: 220 dio_web_adapter:
@@ -222,7 +222,7 @@ packages: @@ -222,7 +222,7 @@ packages:
222 description: 222 description:
223 name: dio_web_adapter 223 name: dio_web_adapter
224 sha256: "3a1b2cd7be71086f38504956e3ebcd2837288d231ff454bafa78021244102bfc" 224 sha256: "3a1b2cd7be71086f38504956e3ebcd2837288d231ff454bafa78021244102bfc"
225 - url: "https://pub.flutter-io.cn" 225 + url: "https://pub.dev"
226 source: hosted 226 source: hosted
227 version: "2.2.2" 227 version: "2.2.2"
228 equatable: 228 equatable:
@@ -230,7 +230,7 @@ packages: @@ -230,7 +230,7 @@ packages:
230 description: 230 description:
231 name: equatable 231 name: equatable
232 sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" 232 sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2"
233 - url: "https://pub.flutter-io.cn" 233 + url: "https://pub.dev"
234 source: hosted 234 source: hosted
235 version: "2.1.0" 235 version: "2.1.0"
236 fake_async: 236 fake_async:
@@ -238,7 +238,7 @@ packages: @@ -238,7 +238,7 @@ packages:
238 description: 238 description:
239 name: fake_async 239 name: fake_async
240 sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" 240 sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
241 - url: "https://pub.flutter-io.cn" 241 + url: "https://pub.dev"
242 source: hosted 242 source: hosted
243 version: "1.3.3" 243 version: "1.3.3"
244 ffi: 244 ffi:
@@ -246,7 +246,7 @@ packages: @@ -246,7 +246,7 @@ packages:
246 description: 246 description:
247 name: ffi 247 name: ffi
248 sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" 248 sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
249 - url: "https://pub.flutter-io.cn" 249 + url: "https://pub.dev"
250 source: hosted 250 source: hosted
251 version: "2.2.0" 251 version: "2.2.0"
252 file: 252 file:
@@ -254,7 +254,7 @@ packages: @@ -254,7 +254,7 @@ packages:
254 description: 254 description:
255 name: file 255 name: file
256 sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 256 sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
257 - url: "https://pub.flutter-io.cn" 257 + url: "https://pub.dev"
258 source: hosted 258 source: hosted
259 version: "7.0.1" 259 version: "7.0.1"
260 file_selector_linux: 260 file_selector_linux:
@@ -262,7 +262,7 @@ packages: @@ -262,7 +262,7 @@ packages:
262 description: 262 description:
263 name: file_selector_linux 263 name: file_selector_linux
264 sha256: da76400e7872ce7637ffdce12749ec24169c25f6195c28372208e65a24bcd2ab 264 sha256: da76400e7872ce7637ffdce12749ec24169c25f6195c28372208e65a24bcd2ab
265 - url: "https://pub.flutter-io.cn" 265 + url: "https://pub.dev"
266 source: hosted 266 source: hosted
267 version: "0.9.4+1" 267 version: "0.9.4+1"
268 file_selector_macos: 268 file_selector_macos:
@@ -270,7 +270,7 @@ packages: @@ -270,7 +270,7 @@ packages:
270 description: 270 description:
271 name: file_selector_macos 271 name: file_selector_macos
272 sha256: d57c62362766b5e7ae739448650b66c6aab7a68ba7ecc65e04018652645ae0f4 272 sha256: d57c62362766b5e7ae739448650b66c6aab7a68ba7ecc65e04018652645ae0f4
273 - url: "https://pub.flutter-io.cn" 273 + url: "https://pub.dev"
274 source: hosted 274 source: hosted
275 version: "0.9.5+1" 275 version: "0.9.5+1"
276 file_selector_platform_interface: 276 file_selector_platform_interface:
@@ -278,7 +278,7 @@ packages: @@ -278,7 +278,7 @@ packages:
278 description: 278 description:
279 name: file_selector_platform_interface 279 name: file_selector_platform_interface
280 sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" 280 sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
281 - url: "https://pub.flutter-io.cn" 281 + url: "https://pub.dev"
282 source: hosted 282 source: hosted
283 version: "2.7.0" 283 version: "2.7.0"
284 file_selector_windows: 284 file_selector_windows:
@@ -286,7 +286,7 @@ packages: @@ -286,7 +286,7 @@ packages:
286 description: 286 description:
287 name: file_selector_windows 287 name: file_selector_windows
288 sha256: fbefc5fb92c6d3cbe8d284a2cd971b593bb07d2cd6da8557b81a862250b4acec 288 sha256: fbefc5fb92c6d3cbe8d284a2cd971b593bb07d2cd6da8557b81a862250b4acec
289 - url: "https://pub.flutter-io.cn" 289 + url: "https://pub.dev"
290 source: hosted 290 source: hosted
291 version: "0.9.3+6" 291 version: "0.9.3+6"
292 fixnum: 292 fixnum:
@@ -294,7 +294,7 @@ packages: @@ -294,7 +294,7 @@ packages:
294 description: 294 description:
295 name: fixnum 295 name: fixnum
296 sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be 296 sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
297 - url: "https://pub.flutter-io.cn" 297 + url: "https://pub.dev"
298 source: hosted 298 source: hosted
299 version: "1.1.1" 299 version: "1.1.1"
300 fl_chart: 300 fl_chart:
@@ -302,7 +302,7 @@ packages: @@ -302,7 +302,7 @@ packages:
302 description: 302 description:
303 name: fl_chart 303 name: fl_chart
304 sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237" 304 sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237"
305 - url: "https://pub.flutter-io.cn" 305 + url: "https://pub.dev"
306 source: hosted 306 source: hosted
307 version: "0.70.2" 307 version: "0.70.2"
308 flutter: 308 flutter:
@@ -315,7 +315,7 @@ packages: @@ -315,7 +315,7 @@ packages:
315 description: 315 description:
316 name: flutter_cache_manager 316 name: flutter_cache_manager
317 sha256: "1de7849213b4c73c85aca7e0ac687a9a5d82ccdb594366b9dcc26cb6a2189cd2" 317 sha256: "1de7849213b4c73c85aca7e0ac687a9a5d82ccdb594366b9dcc26cb6a2189cd2"
318 - url: "https://pub.flutter-io.cn" 318 + url: "https://pub.dev"
319 source: hosted 319 source: hosted
320 version: "3.4.2" 320 version: "3.4.2"
321 flutter_lints: 321 flutter_lints:
@@ -323,7 +323,7 @@ packages: @@ -323,7 +323,7 @@ packages:
323 description: 323 description:
324 name: flutter_lints 324 name: flutter_lints
325 sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" 325 sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
326 - url: "https://pub.flutter-io.cn" 326 + url: "https://pub.dev"
327 source: hosted 327 source: hosted
328 version: "5.0.0" 328 version: "5.0.0"
329 flutter_localizations: 329 flutter_localizations:
@@ -336,7 +336,7 @@ packages: @@ -336,7 +336,7 @@ packages:
336 description: 336 description:
337 name: flutter_plugin_android_lifecycle 337 name: flutter_plugin_android_lifecycle
338 sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" 338 sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785"
339 - url: "https://pub.flutter-io.cn" 339 + url: "https://pub.dev"
340 source: hosted 340 source: hosted
341 version: "2.0.35" 341 version: "2.0.35"
342 flutter_test: 342 flutter_test:
@@ -349,7 +349,7 @@ packages: @@ -349,7 +349,7 @@ packages:
349 description: 349 description:
350 name: flutter_timezone 350 name: flutter_timezone
351 sha256: "869677426fde92dbe170fb7d2d4929f2a8343c2f5f62f08b0bb64f908630b073" 351 sha256: "869677426fde92dbe170fb7d2d4929f2a8343c2f5f62f08b0bb64f908630b073"
352 - url: "https://pub.flutter-io.cn" 352 + url: "https://pub.dev"
353 source: hosted 353 source: hosted
354 version: "5.1.0" 354 version: "5.1.0"
355 flutter_web_plugins: 355 flutter_web_plugins:
@@ -371,7 +371,7 @@ packages: @@ -371,7 +371,7 @@ packages:
371 description: 371 description:
372 name: get 372 name: get
373 sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" 373 sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a"
374 - url: "https://pub.flutter-io.cn" 374 + url: "https://pub.dev"
375 source: hosted 375 source: hosted
376 version: "4.7.3" 376 version: "4.7.3"
377 glob: 377 glob:
@@ -379,7 +379,7 @@ packages: @@ -379,7 +379,7 @@ packages:
379 description: 379 description:
380 name: glob 380 name: glob
381 sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb" 381 sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb"
382 - url: "https://pub.flutter-io.cn" 382 + url: "https://pub.dev"
383 source: hosted 383 source: hosted
384 version: "2.2.0" 384 version: "2.2.0"
385 graphs: 385 graphs:
@@ -387,7 +387,7 @@ packages: @@ -387,7 +387,7 @@ packages:
387 description: 387 description:
388 name: graphs 388 name: graphs
389 sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" 389 sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
390 - url: "https://pub.flutter-io.cn" 390 + url: "https://pub.dev"
391 source: hosted 391 source: hosted
392 version: "2.3.2" 392 version: "2.3.2"
393 hooks: 393 hooks:
@@ -395,7 +395,7 @@ packages: @@ -395,7 +395,7 @@ packages:
395 description: 395 description:
396 name: hooks 396 name: hooks
397 sha256: eaac480a35ec0814146c2c48d96aaa829e0e44a7662c88ae84c9edf4bc35651f 397 sha256: eaac480a35ec0814146c2c48d96aaa829e0e44a7662c88ae84c9edf4bc35651f
398 - url: "https://pub.flutter-io.cn" 398 + url: "https://pub.dev"
399 source: hosted 399 source: hosted
400 version: "2.2.0" 400 version: "2.2.0"
401 http: 401 http:
@@ -403,7 +403,7 @@ packages: @@ -403,7 +403,7 @@ packages:
403 description: 403 description:
404 name: http 404 name: http
405 sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" 405 sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
406 - url: "https://pub.flutter-io.cn" 406 + url: "https://pub.dev"
407 source: hosted 407 source: hosted
408 version: "1.6.0" 408 version: "1.6.0"
409 http_multi_server: 409 http_multi_server:
@@ -411,7 +411,7 @@ packages: @@ -411,7 +411,7 @@ packages:
411 description: 411 description:
412 name: http_multi_server 412 name: http_multi_server
413 sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 413 sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
414 - url: "https://pub.flutter-io.cn" 414 + url: "https://pub.dev"
415 source: hosted 415 source: hosted
416 version: "3.2.2" 416 version: "3.2.2"
417 http_parser: 417 http_parser:
@@ -419,7 +419,7 @@ packages: @@ -419,7 +419,7 @@ packages:
419 description: 419 description:
420 name: http_parser 420 name: http_parser
421 sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" 421 sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
422 - url: "https://pub.flutter-io.cn" 422 + url: "https://pub.dev"
423 source: hosted 423 source: hosted
424 version: "4.1.2" 424 version: "4.1.2"
425 image_cropper: 425 image_cropper:
@@ -463,7 +463,7 @@ packages: @@ -463,7 +463,7 @@ packages:
463 description: 463 description:
464 name: image_picker_android 464 name: image_picker_android
465 sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f 465 sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f
466 - url: "https://pub.flutter-io.cn" 466 + url: "https://pub.dev"
467 source: hosted 467 source: hosted
468 version: "0.8.13+17" 468 version: "0.8.13+17"
469 image_picker_for_web: 469 image_picker_for_web:
@@ -471,7 +471,7 @@ packages: @@ -471,7 +471,7 @@ packages:
471 description: 471 description:
472 name: image_picker_for_web 472 name: image_picker_for_web
473 sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" 473 sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214"
474 - url: "https://pub.flutter-io.cn" 474 + url: "https://pub.dev"
475 source: hosted 475 source: hosted
476 version: "3.1.1" 476 version: "3.1.1"
477 image_picker_ios: 477 image_picker_ios:
@@ -479,7 +479,7 @@ packages: @@ -479,7 +479,7 @@ packages:
479 description: 479 description:
480 name: image_picker_ios 480 name: image_picker_ios
481 sha256: ee3885b6fcd71958fbc79770dd194c63371439d536d69c47b279171a486482ae 481 sha256: ee3885b6fcd71958fbc79770dd194c63371439d536d69c47b279171a486482ae
482 - url: "https://pub.flutter-io.cn" 482 + url: "https://pub.dev"
483 source: hosted 483 source: hosted
484 version: "0.8.13+7" 484 version: "0.8.13+7"
485 image_picker_linux: 485 image_picker_linux:
@@ -487,7 +487,7 @@ packages: @@ -487,7 +487,7 @@ packages:
487 description: 487 description:
488 name: image_picker_linux 488 name: image_picker_linux
489 sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" 489 sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
490 - url: "https://pub.flutter-io.cn" 490 + url: "https://pub.dev"
491 source: hosted 491 source: hosted
492 version: "0.2.2" 492 version: "0.2.2"
493 image_picker_macos: 493 image_picker_macos:
@@ -495,7 +495,7 @@ packages: @@ -495,7 +495,7 @@ packages:
495 description: 495 description:
496 name: image_picker_macos 496 name: image_picker_macos
497 sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" 497 sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91"
498 - url: "https://pub.flutter-io.cn" 498 + url: "https://pub.dev"
499 source: hosted 499 source: hosted
500 version: "0.2.2+1" 500 version: "0.2.2+1"
501 image_picker_ohos: 501 image_picker_ohos:
@@ -512,7 +512,7 @@ packages: @@ -512,7 +512,7 @@ packages:
512 description: 512 description:
513 name: image_picker_platform_interface 513 name: image_picker_platform_interface
514 sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" 514 sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
515 - url: "https://pub.flutter-io.cn" 515 + url: "https://pub.dev"
516 source: hosted 516 source: hosted
517 version: "2.11.1" 517 version: "2.11.1"
518 image_picker_windows: 518 image_picker_windows:
@@ -520,7 +520,7 @@ packages: @@ -520,7 +520,7 @@ packages:
520 description: 520 description:
521 name: image_picker_windows 521 name: image_picker_windows
522 sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae 522 sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
523 - url: "https://pub.flutter-io.cn" 523 + url: "https://pub.dev"
524 source: hosted 524 source: hosted
525 version: "0.2.2" 525 version: "0.2.2"
526 intl: 526 intl:
@@ -528,7 +528,7 @@ packages: @@ -528,7 +528,7 @@ packages:
528 description: 528 description:
529 name: intl 529 name: intl
530 sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" 530 sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
531 - url: "https://pub.flutter-io.cn" 531 + url: "https://pub.dev"
532 source: hosted 532 source: hosted
533 version: "0.20.2" 533 version: "0.20.2"
534 io: 534 io:
@@ -536,7 +536,7 @@ packages: @@ -536,7 +536,7 @@ packages:
536 description: 536 description:
537 name: io 537 name: io
538 sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f" 538 sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f"
539 - url: "https://pub.flutter-io.cn" 539 + url: "https://pub.dev"
540 source: hosted 540 source: hosted
541 version: "1.1.0" 541 version: "1.1.0"
542 jni: 542 jni:
@@ -544,7 +544,7 @@ packages: @@ -544,7 +544,7 @@ packages:
544 description: 544 description:
545 name: jni 545 name: jni
546 sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3 546 sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3
547 - url: "https://pub.flutter-io.cn" 547 + url: "https://pub.dev"
548 source: hosted 548 source: hosted
549 version: "1.0.3" 549 version: "1.0.3"
550 jni_flutter: 550 jni_flutter:
@@ -552,7 +552,7 @@ packages: @@ -552,7 +552,7 @@ packages:
552 description: 552 description:
553 name: jni_flutter 553 name: jni_flutter
554 sha256: b2310cdd4c18c65c081ab141a41efa94aa26c65431803703ece51996f174f351 554 sha256: b2310cdd4c18c65c081ab141a41efa94aa26c65431803703ece51996f174f351
555 - url: "https://pub.flutter-io.cn" 555 + url: "https://pub.dev"
556 source: hosted 556 source: hosted
557 version: "1.0.3" 557 version: "1.0.3"
558 jni_util: 558 jni_util:
@@ -560,7 +560,7 @@ packages: @@ -560,7 +560,7 @@ packages:
560 description: 560 description:
561 name: jni_util 561 name: jni_util
562 sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f" 562 sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f"
563 - url: "https://pub.flutter-io.cn" 563 + url: "https://pub.dev"
564 source: hosted 564 source: hosted
565 version: "1.0.0" 565 version: "1.0.0"
566 json_annotation: 566 json_annotation:
@@ -568,7 +568,7 @@ packages: @@ -568,7 +568,7 @@ packages:
568 description: 568 description:
569 name: json_annotation 569 name: json_annotation
570 sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" 570 sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80"
571 - url: "https://pub.flutter-io.cn" 571 + url: "https://pub.dev"
572 source: hosted 572 source: hosted
573 version: "4.12.0" 573 version: "4.12.0"
574 leak_tracker: 574 leak_tracker:
@@ -576,7 +576,7 @@ packages: @@ -576,7 +576,7 @@ packages:
576 description: 576 description:
577 name: leak_tracker 577 name: leak_tracker
578 sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" 578 sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
579 - url: "https://pub.flutter-io.cn" 579 + url: "https://pub.dev"
580 source: hosted 580 source: hosted
581 version: "11.0.2" 581 version: "11.0.2"
582 leak_tracker_flutter_testing: 582 leak_tracker_flutter_testing:
@@ -584,7 +584,7 @@ packages: @@ -584,7 +584,7 @@ packages:
584 description: 584 description:
585 name: leak_tracker_flutter_testing 585 name: leak_tracker_flutter_testing
586 sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" 586 sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
587 - url: "https://pub.flutter-io.cn" 587 + url: "https://pub.dev"
588 source: hosted 588 source: hosted
589 version: "3.0.10" 589 version: "3.0.10"
590 leak_tracker_testing: 590 leak_tracker_testing:
@@ -592,7 +592,7 @@ packages: @@ -592,7 +592,7 @@ packages:
592 description: 592 description:
593 name: leak_tracker_testing 593 name: leak_tracker_testing
594 sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" 594 sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
595 - url: "https://pub.flutter-io.cn" 595 + url: "https://pub.dev"
596 source: hosted 596 source: hosted
597 version: "3.0.2" 597 version: "3.0.2"
598 lints: 598 lints:
@@ -600,7 +600,7 @@ packages: @@ -600,7 +600,7 @@ packages:
600 description: 600 description:
601 name: lints 601 name: lints
602 sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 602 sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
603 - url: "https://pub.flutter-io.cn" 603 + url: "https://pub.dev"
604 source: hosted 604 source: hosted
605 version: "5.1.1" 605 version: "5.1.1"
606 logger: 606 logger:
@@ -608,7 +608,7 @@ packages: @@ -608,7 +608,7 @@ packages:
608 description: 608 description:
609 name: logger 609 name: logger
610 sha256: "2a0dc097e7b01d942475bdd552356db2d0f768b05540bd4b2b53f1840f2239a7" 610 sha256: "2a0dc097e7b01d942475bdd552356db2d0f768b05540bd4b2b53f1840f2239a7"
611 - url: "https://pub.flutter-io.cn" 611 + url: "https://pub.dev"
612 source: hosted 612 source: hosted
613 version: "2.8.0" 613 version: "2.8.0"
614 logging: 614 logging:
@@ -616,7 +616,7 @@ packages: @@ -616,7 +616,7 @@ packages:
616 description: 616 description:
617 name: logging 617 name: logging
618 sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 618 sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
619 - url: "https://pub.flutter-io.cn" 619 + url: "https://pub.dev"
620 source: hosted 620 source: hosted
621 version: "1.3.0" 621 version: "1.3.0"
622 lottie: 622 lottie:
@@ -624,7 +624,7 @@ packages: @@ -624,7 +624,7 @@ packages:
624 description: 624 description:
625 name: lottie 625 name: lottie
626 sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 626 sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950
627 - url: "https://pub.flutter-io.cn" 627 + url: "https://pub.dev"
628 source: hosted 628 source: hosted
629 version: "3.3.1" 629 version: "3.3.1"
630 matcher: 630 matcher:
@@ -632,7 +632,7 @@ packages: @@ -632,7 +632,7 @@ packages:
632 description: 632 description:
633 name: matcher 633 name: matcher
634 sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 634 sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
635 - url: "https://pub.flutter-io.cn" 635 + url: "https://pub.dev"
636 source: hosted 636 source: hosted
637 version: "0.12.19" 637 version: "0.12.19"
638 material_color_utilities: 638 material_color_utilities:
@@ -640,7 +640,7 @@ packages: @@ -640,7 +640,7 @@ packages:
640 description: 640 description:
641 name: material_color_utilities 641 name: material_color_utilities
642 sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" 642 sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
643 - url: "https://pub.flutter-io.cn" 643 + url: "https://pub.dev"
644 source: hosted 644 source: hosted
645 version: "0.13.0" 645 version: "0.13.0"
646 meta: 646 meta:
@@ -648,7 +648,7 @@ packages: @@ -648,7 +648,7 @@ packages:
648 description: 648 description:
649 name: meta 649 name: meta
650 sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9" 650 sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9"
651 - url: "https://pub.flutter-io.cn" 651 + url: "https://pub.dev"
652 source: hosted 652 source: hosted
653 version: "1.19.0" 653 version: "1.19.0"
654 mime: 654 mime:
@@ -656,7 +656,7 @@ packages: @@ -656,7 +656,7 @@ packages:
656 description: 656 description:
657 name: mime 657 name: mime
658 sha256: bd47de35f07e27267e69c8c8b22edf9473bfee170a60d60fcc93730c5144b7f6 658 sha256: bd47de35f07e27267e69c8c8b22edf9473bfee170a60d60fcc93730c5144b7f6
659 - url: "https://pub.flutter-io.cn" 659 + url: "https://pub.dev"
660 source: hosted 660 source: hosted
661 version: "2.1.0" 661 version: "2.1.0"
662 objective_c: 662 objective_c:
@@ -664,7 +664,7 @@ packages: @@ -664,7 +664,7 @@ packages:
664 description: 664 description:
665 name: objective_c 665 name: objective_c
666 sha256: ad56fd53a78ff6b1472fa59ff2a4e8b8ccabafc586fc263a1dfad0b99b5553e3 666 sha256: ad56fd53a78ff6b1472fa59ff2a4e8b8ccabafc586fc263a1dfad0b99b5553e3
667 - url: "https://pub.flutter-io.cn" 667 + url: "https://pub.dev"
668 source: hosted 668 source: hosted
669 version: "9.6.0" 669 version: "9.6.0"
670 octo_image: 670 octo_image:
@@ -672,7 +672,7 @@ packages: @@ -672,7 +672,7 @@ packages:
672 description: 672 description:
673 name: octo_image 673 name: octo_image
674 sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" 674 sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
675 - url: "https://pub.flutter-io.cn" 675 + url: "https://pub.dev"
676 source: hosted 676 source: hosted
677 version: "2.1.0" 677 version: "2.1.0"
678 package_config: 678 package_config:
@@ -680,7 +680,7 @@ packages: @@ -680,7 +680,7 @@ packages:
680 description: 680 description:
681 name: package_config 681 name: package_config
682 sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc 682 sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
683 - url: "https://pub.flutter-io.cn" 683 + url: "https://pub.dev"
684 source: hosted 684 source: hosted
685 version: "2.2.0" 685 version: "2.2.0"
686 path: 686 path:
@@ -688,7 +688,7 @@ packages: @@ -688,7 +688,7 @@ packages:
688 description: 688 description:
689 name: path 689 name: path
690 sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 690 sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
691 - url: "https://pub.flutter-io.cn" 691 + url: "https://pub.dev"
692 source: hosted 692 source: hosted
693 version: "1.9.1" 693 version: "1.9.1"
694 path_provider: 694 path_provider:
@@ -705,7 +705,7 @@ packages: @@ -705,7 +705,7 @@ packages:
705 description: 705 description:
706 name: path_provider_android 706 name: path_provider_android
707 sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" 707 sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd"
708 - url: "https://pub.flutter-io.cn" 708 + url: "https://pub.dev"
709 source: hosted 709 source: hosted
710 version: "2.3.1" 710 version: "2.3.1"
711 path_provider_foundation: 711 path_provider_foundation:
@@ -713,7 +713,7 @@ packages: @@ -713,7 +713,7 @@ packages:
713 description: 713 description:
714 name: path_provider_foundation 714 name: path_provider_foundation
715 sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" 715 sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
716 - url: "https://pub.flutter-io.cn" 716 + url: "https://pub.dev"
717 source: hosted 717 source: hosted
718 version: "2.6.0" 718 version: "2.6.0"
719 path_provider_linux: 719 path_provider_linux:
@@ -721,7 +721,7 @@ packages: @@ -721,7 +721,7 @@ packages:
721 description: 721 description:
722 name: path_provider_linux 722 name: path_provider_linux
723 sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" 723 sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16"
724 - url: "https://pub.flutter-io.cn" 724 + url: "https://pub.dev"
725 source: hosted 725 source: hosted
726 version: "2.2.2" 726 version: "2.2.2"
727 path_provider_ohos: 727 path_provider_ohos:
@@ -738,7 +738,7 @@ packages: @@ -738,7 +738,7 @@ packages:
738 description: 738 description:
739 name: path_provider_platform_interface 739 name: path_provider_platform_interface
740 sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" 740 sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda"
741 - url: "https://pub.flutter-io.cn" 741 + url: "https://pub.dev"
742 source: hosted 742 source: hosted
743 version: "2.1.3" 743 version: "2.1.3"
744 path_provider_windows: 744 path_provider_windows:
@@ -746,7 +746,7 @@ packages: @@ -746,7 +746,7 @@ packages:
746 description: 746 description:
747 name: path_provider_windows 747 name: path_provider_windows
748 sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 748 sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
749 - url: "https://pub.flutter-io.cn" 749 + url: "https://pub.dev"
750 source: hosted 750 source: hosted
751 version: "2.3.0" 751 version: "2.3.0"
752 permission_handler: 752 permission_handler:
@@ -754,7 +754,7 @@ packages: @@ -754,7 +754,7 @@ packages:
754 description: 754 description:
755 name: permission_handler 755 name: permission_handler
756 sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" 756 sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
757 - url: "https://pub.flutter-io.cn" 757 + url: "https://pub.dev"
758 source: hosted 758 source: hosted
759 version: "11.4.0" 759 version: "11.4.0"
760 permission_handler_android: 760 permission_handler_android:
@@ -762,7 +762,7 @@ packages: @@ -762,7 +762,7 @@ packages:
762 description: 762 description:
763 name: permission_handler_android 763 name: permission_handler_android
764 sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc 764 sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
765 - url: "https://pub.flutter-io.cn" 765 + url: "https://pub.dev"
766 source: hosted 766 source: hosted
767 version: "12.1.0" 767 version: "12.1.0"
768 permission_handler_apple: 768 permission_handler_apple:
@@ -770,7 +770,7 @@ packages: @@ -770,7 +770,7 @@ packages:
770 description: 770 description:
771 name: permission_handler_apple 771 name: permission_handler_apple
772 sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8 772 sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8
773 - url: "https://pub.flutter-io.cn" 773 + url: "https://pub.dev"
774 source: hosted 774 source: hosted
775 version: "9.6.1" 775 version: "9.6.1"
776 permission_handler_html: 776 permission_handler_html:
@@ -778,7 +778,7 @@ packages: @@ -778,7 +778,7 @@ packages:
778 description: 778 description:
779 name: permission_handler_html 779 name: permission_handler_html
780 sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac" 780 sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac"
781 - url: "https://pub.flutter-io.cn" 781 + url: "https://pub.dev"
782 source: hosted 782 source: hosted
783 version: "0.1.4+1" 783 version: "0.1.4+1"
784 permission_handler_ohos: 784 permission_handler_ohos:
@@ -795,7 +795,7 @@ packages: @@ -795,7 +795,7 @@ packages:
795 description: 795 description:
796 name: permission_handler_platform_interface 796 name: permission_handler_platform_interface
797 sha256: ed86a61c190258fdd65de395ea0632822e3415c1faec38eae0c31b479c28a531 797 sha256: ed86a61c190258fdd65de395ea0632822e3415c1faec38eae0c31b479c28a531
798 - url: "https://pub.flutter-io.cn" 798 + url: "https://pub.dev"
799 source: hosted 799 source: hosted
800 version: "4.4.1" 800 version: "4.4.1"
801 permission_handler_windows: 801 permission_handler_windows:
@@ -803,7 +803,7 @@ packages: @@ -803,7 +803,7 @@ packages:
803 description: 803 description:
804 name: permission_handler_windows 804 name: permission_handler_windows
805 sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd 805 sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd
806 - url: "https://pub.flutter-io.cn" 806 + url: "https://pub.dev"
807 source: hosted 807 source: hosted
808 version: "0.2.2" 808 version: "0.2.2"
809 pigeon: 809 pigeon:
@@ -820,7 +820,7 @@ packages: @@ -820,7 +820,7 @@ packages:
820 description: 820 description:
821 name: platform 821 name: platform
822 sha256: a36d119c13416516a7b5913fbe8af8531e11633d784c550b2125f76c758524ec 822 sha256: a36d119c13416516a7b5913fbe8af8531e11633d784c550b2125f76c758524ec
823 - url: "https://pub.flutter-io.cn" 823 + url: "https://pub.dev"
824 source: hosted 824 source: hosted
825 version: "3.2.0" 825 version: "3.2.0"
826 plugin_platform_interface: 826 plugin_platform_interface:
@@ -828,7 +828,7 @@ packages: @@ -828,7 +828,7 @@ packages:
828 description: 828 description:
829 name: plugin_platform_interface 829 name: plugin_platform_interface
830 sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 830 sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
831 - url: "https://pub.flutter-io.cn" 831 + url: "https://pub.dev"
832 source: hosted 832 source: hosted
833 version: "2.1.8" 833 version: "2.1.8"
834 pool: 834 pool:
@@ -836,7 +836,7 @@ packages: @@ -836,7 +836,7 @@ packages:
836 description: 836 description:
837 name: pool 837 name: pool
838 sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c" 838 sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c"
839 - url: "https://pub.flutter-io.cn" 839 + url: "https://pub.dev"
840 source: hosted 840 source: hosted
841 version: "1.5.3" 841 version: "1.5.3"
842 posix: 842 posix:
@@ -844,7 +844,7 @@ packages: @@ -844,7 +844,7 @@ packages:
844 description: 844 description:
845 name: posix 845 name: posix
846 sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e 846 sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e
847 - url: "https://pub.flutter-io.cn" 847 + url: "https://pub.dev"
848 source: hosted 848 source: hosted
849 version: "6.5.2" 849 version: "6.5.2"
850 pretty_dio_logger: 850 pretty_dio_logger:
@@ -852,7 +852,7 @@ packages: @@ -852,7 +852,7 @@ packages:
852 description: 852 description:
853 name: pretty_dio_logger 853 name: pretty_dio_logger
854 sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" 854 sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407"
855 - url: "https://pub.flutter-io.cn" 855 + url: "https://pub.dev"
856 source: hosted 856 source: hosted
857 version: "1.4.0" 857 version: "1.4.0"
858 pub_semver: 858 pub_semver:
@@ -860,7 +860,7 @@ packages: @@ -860,7 +860,7 @@ packages:
860 description: 860 description:
861 name: pub_semver 861 name: pub_semver
862 sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24" 862 sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24"
863 - url: "https://pub.flutter-io.cn" 863 + url: "https://pub.dev"
864 source: hosted 864 source: hosted
865 version: "2.2.1" 865 version: "2.2.1"
866 pubspec_parse: 866 pubspec_parse:
@@ -868,7 +868,7 @@ packages: @@ -868,7 +868,7 @@ packages:
868 description: 868 description:
869 name: pubspec_parse 869 name: pubspec_parse
870 sha256: c38b81cbf34450b67e0265d73433569d12e34782e30ed769c9cc99c9d5f2e796 870 sha256: c38b81cbf34450b67e0265d73433569d12e34782e30ed769c9cc99c9d5f2e796
871 - url: "https://pub.flutter-io.cn" 871 + url: "https://pub.dev"
872 source: hosted 872 source: hosted
873 version: "1.6.0" 873 version: "1.6.0"
874 record_use: 874 record_use:
@@ -876,7 +876,7 @@ packages: @@ -876,7 +876,7 @@ packages:
876 description: 876 description:
877 name: record_use 877 name: record_use
878 sha256: "1cb8564af8d43b464294411db9217f5ec04891c6f22ee2c32d73ae05e88a6bd2" 878 sha256: "1cb8564af8d43b464294411db9217f5ec04891c6f22ee2c32d73ae05e88a6bd2"
879 - url: "https://pub.flutter-io.cn" 879 + url: "https://pub.dev"
880 source: hosted 880 source: hosted
881 version: "1.1.1" 881 version: "1.1.1"
882 rxdart: 882 rxdart:
@@ -884,7 +884,7 @@ packages: @@ -884,7 +884,7 @@ packages:
884 description: 884 description:
885 name: rxdart 885 name: rxdart
886 sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" 886 sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
887 - url: "https://pub.flutter-io.cn" 887 + url: "https://pub.dev"
888 source: hosted 888 source: hosted
889 version: "0.28.0" 889 version: "0.28.0"
890 share_plus: 890 share_plus:
@@ -919,7 +919,7 @@ packages: @@ -919,7 +919,7 @@ packages:
919 description: 919 description:
920 name: shared_preferences_android 920 name: shared_preferences_android
921 sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 921 sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
922 - url: "https://pub.flutter-io.cn" 922 + url: "https://pub.dev"
923 source: hosted 923 source: hosted
924 version: "2.4.23" 924 version: "2.4.23"
925 shared_preferences_foundation: 925 shared_preferences_foundation:
@@ -927,7 +927,7 @@ packages: @@ -927,7 +927,7 @@ packages:
927 description: 927 description:
928 name: shared_preferences_foundation 928 name: shared_preferences_foundation
929 sha256: "2ec3934efa51e46117f23031cc141b8fc878e8525b94ec1ea4f7f586cf1b47ea" 929 sha256: "2ec3934efa51e46117f23031cc141b8fc878e8525b94ec1ea4f7f586cf1b47ea"
930 - url: "https://pub.flutter-io.cn" 930 + url: "https://pub.dev"
931 source: hosted 931 source: hosted
932 version: "2.5.7" 932 version: "2.5.7"
933 shared_preferences_linux: 933 shared_preferences_linux:
@@ -935,7 +935,7 @@ packages: @@ -935,7 +935,7 @@ packages:
935 description: 935 description:
936 name: shared_preferences_linux 936 name: shared_preferences_linux
937 sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" 937 sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
938 - url: "https://pub.flutter-io.cn" 938 + url: "https://pub.dev"
939 source: hosted 939 source: hosted
940 version: "2.4.1" 940 version: "2.4.1"
941 shared_preferences_ohos: 941 shared_preferences_ohos:
@@ -952,7 +952,7 @@ packages: @@ -952,7 +952,7 @@ packages:
952 description: 952 description:
953 name: shared_preferences_platform_interface 953 name: shared_preferences_platform_interface
954 sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" 954 sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
955 - url: "https://pub.flutter-io.cn" 955 + url: "https://pub.dev"
956 source: hosted 956 source: hosted
957 version: "2.4.2" 957 version: "2.4.2"
958 shared_preferences_web: 958 shared_preferences_web:
@@ -960,7 +960,7 @@ packages: @@ -960,7 +960,7 @@ packages:
960 description: 960 description:
961 name: shared_preferences_web 961 name: shared_preferences_web
962 sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 962 sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
963 - url: "https://pub.flutter-io.cn" 963 + url: "https://pub.dev"
964 source: hosted 964 source: hosted
965 version: "2.4.3" 965 version: "2.4.3"
966 shared_preferences_windows: 966 shared_preferences_windows:
@@ -968,7 +968,7 @@ packages: @@ -968,7 +968,7 @@ packages:
968 description: 968 description:
969 name: shared_preferences_windows 969 name: shared_preferences_windows
970 sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" 970 sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
971 - url: "https://pub.flutter-io.cn" 971 + url: "https://pub.dev"
972 source: hosted 972 source: hosted
973 version: "2.4.1" 973 version: "2.4.1"
974 shelf: 974 shelf:
@@ -976,7 +976,7 @@ packages: @@ -976,7 +976,7 @@ packages:
976 description: 976 description:
977 name: shelf 977 name: shelf
978 sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 978 sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
979 - url: "https://pub.flutter-io.cn" 979 + url: "https://pub.dev"
980 source: hosted 980 source: hosted
981 version: "1.4.2" 981 version: "1.4.2"
982 shelf_web_socket: 982 shelf_web_socket:
@@ -984,7 +984,7 @@ packages: @@ -984,7 +984,7 @@ packages:
984 description: 984 description:
985 name: shelf_web_socket 985 name: shelf_web_socket
986 sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" 986 sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
987 - url: "https://pub.flutter-io.cn" 987 + url: "https://pub.dev"
988 source: hosted 988 source: hosted
989 version: "3.0.0" 989 version: "3.0.0"
990 simple_gesture_detector: 990 simple_gesture_detector:
@@ -992,7 +992,7 @@ packages: @@ -992,7 +992,7 @@ packages:
992 description: 992 description:
993 name: simple_gesture_detector 993 name: simple_gesture_detector
994 sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 994 sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3
995 - url: "https://pub.flutter-io.cn" 995 + url: "https://pub.dev"
996 source: hosted 996 source: hosted
997 version: "0.2.1" 997 version: "0.2.1"
998 sky_engine: 998 sky_engine:
@@ -1005,7 +1005,7 @@ packages: @@ -1005,7 +1005,7 @@ packages:
1005 description: 1005 description:
1006 name: source_span 1006 name: source_span
1007 sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" 1007 sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
1008 - url: "https://pub.flutter-io.cn" 1008 + url: "https://pub.dev"
1009 source: hosted 1009 source: hosted
1010 version: "1.10.2" 1010 version: "1.10.2"
1011 sqflite: 1011 sqflite:
@@ -1022,7 +1022,7 @@ packages: @@ -1022,7 +1022,7 @@ packages:
1022 description: 1022 description:
1023 name: sqflite_android 1023 name: sqflite_android
1024 sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" 1024 sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40"
1025 - url: "https://pub.flutter-io.cn" 1025 + url: "https://pub.dev"
1026 source: hosted 1026 source: hosted
1027 version: "2.4.2+3" 1027 version: "2.4.2+3"
1028 sqflite_common: 1028 sqflite_common:
@@ -1030,7 +1030,7 @@ packages: @@ -1030,7 +1030,7 @@ packages:
1030 description: 1030 description:
1031 name: sqflite_common 1031 name: sqflite_common
1032 sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" 1032 sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465"
1033 - url: "https://pub.flutter-io.cn" 1033 + url: "https://pub.dev"
1034 source: hosted 1034 source: hosted
1035 version: "2.5.8" 1035 version: "2.5.8"
1036 sqflite_darwin: 1036 sqflite_darwin:
@@ -1038,7 +1038,7 @@ packages: @@ -1038,7 +1038,7 @@ packages:
1038 description: 1038 description:
1039 name: sqflite_darwin 1039 name: sqflite_darwin
1040 sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" 1040 sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
1041 - url: "https://pub.flutter-io.cn" 1041 + url: "https://pub.dev"
1042 source: hosted 1042 source: hosted
1043 version: "2.4.2" 1043 version: "2.4.2"
1044 sqflite_ohos: 1044 sqflite_ohos:
@@ -1055,7 +1055,7 @@ packages: @@ -1055,7 +1055,7 @@ packages:
1055 description: 1055 description:
1056 name: sqflite_platform_interface 1056 name: sqflite_platform_interface
1057 sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" 1057 sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
1058 - url: "https://pub.flutter-io.cn" 1058 + url: "https://pub.dev"
1059 source: hosted 1059 source: hosted
1060 version: "2.4.0" 1060 version: "2.4.0"
1061 stack_trace: 1061 stack_trace:
@@ -1063,7 +1063,7 @@ packages: @@ -1063,7 +1063,7 @@ packages:
1063 description: 1063 description:
1064 name: stack_trace 1064 name: stack_trace
1065 sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 1065 sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
1066 - url: "https://pub.flutter-io.cn" 1066 + url: "https://pub.dev"
1067 source: hosted 1067 source: hosted
1068 version: "1.12.1" 1068 version: "1.12.1"
1069 stream_channel: 1069 stream_channel:
@@ -1071,7 +1071,7 @@ packages: @@ -1071,7 +1071,7 @@ packages:
1071 description: 1071 description:
1072 name: stream_channel 1072 name: stream_channel
1073 sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 1073 sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
1074 - url: "https://pub.flutter-io.cn" 1074 + url: "https://pub.dev"
1075 source: hosted 1075 source: hosted
1076 version: "2.1.4" 1076 version: "2.1.4"
1077 stream_transform: 1077 stream_transform:
@@ -1079,7 +1079,7 @@ packages: @@ -1079,7 +1079,7 @@ packages:
1079 description: 1079 description:
1080 name: stream_transform 1080 name: stream_transform
1081 sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a 1081 sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a
1082 - url: "https://pub.flutter-io.cn" 1082 + url: "https://pub.dev"
1083 source: hosted 1083 source: hosted
1084 version: "2.1.2" 1084 version: "2.1.2"
1085 string_scanner: 1085 string_scanner:
@@ -1087,23 +1087,23 @@ packages: @@ -1087,23 +1087,23 @@ packages:
1087 description: 1087 description:
1088 name: string_scanner 1088 name: string_scanner
1089 sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 1089 sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
1090 - url: "https://pub.flutter-io.cn" 1090 + url: "https://pub.dev"
1091 source: hosted 1091 source: hosted
1092 version: "1.4.1" 1092 version: "1.4.1"
1093 synchronized: 1093 synchronized:
1094 dependency: transitive 1094 dependency: transitive
1095 description: 1095 description:
1096 name: synchronized 1096 name: synchronized
1097 - sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5"  
1098 - url: "https://pub.flutter-io.cn" 1097 + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
  1098 + url: "https://pub.dev"
1099 source: hosted 1099 source: hosted
1100 - version: "3.4.0+1" 1100 + version: "3.4.0"
1101 table_calendar: 1101 table_calendar:
1102 dependency: "direct main" 1102 dependency: "direct main"
1103 description: 1103 description:
1104 name: table_calendar 1104 name: table_calendar
1105 sha256: f276347cad425ef837a41e8d9ad43f3ee7d59227aa4c36d7430607a5a18fa3b3 1105 sha256: f276347cad425ef837a41e8d9ad43f3ee7d59227aa4c36d7430607a5a18fa3b3
1106 - url: "https://pub.flutter-io.cn" 1106 + url: "https://pub.dev"
1107 source: hosted 1107 source: hosted
1108 version: "3.2.1" 1108 version: "3.2.1"
1109 term_glyph: 1109 term_glyph:
@@ -1111,7 +1111,7 @@ packages: @@ -1111,7 +1111,7 @@ packages:
1111 description: 1111 description:
1112 name: term_glyph 1112 name: term_glyph
1113 sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 1113 sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
1114 - url: "https://pub.flutter-io.cn" 1114 + url: "https://pub.dev"
1115 source: hosted 1115 source: hosted
1116 version: "1.2.2" 1116 version: "1.2.2"
1117 test_api: 1117 test_api:
@@ -1119,7 +1119,7 @@ packages: @@ -1119,7 +1119,7 @@ packages:
1119 description: 1119 description:
1120 name: test_api 1120 name: test_api
1121 sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" 1121 sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
1122 - url: "https://pub.flutter-io.cn" 1122 + url: "https://pub.dev"
1123 source: hosted 1123 source: hosted
1124 version: "0.7.10" 1124 version: "0.7.10"
1125 thinking_analytics: 1125 thinking_analytics:
@@ -1127,7 +1127,7 @@ packages: @@ -1127,7 +1127,7 @@ packages:
1127 description: 1127 description:
1128 name: thinking_analytics 1128 name: thinking_analytics
1129 sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02 1129 sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02
1130 - url: "https://pub.flutter-io.cn" 1130 + url: "https://pub.dev"
1131 source: hosted 1131 source: hosted
1132 version: "3.3.3" 1132 version: "3.3.3"
1133 typed_data: 1133 typed_data:
@@ -1135,7 +1135,7 @@ packages: @@ -1135,7 +1135,7 @@ packages:
1135 description: 1135 description:
1136 name: typed_data 1136 name: typed_data
1137 sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 1137 sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
1138 - url: "https://pub.flutter-io.cn" 1138 + url: "https://pub.dev"
1139 source: hosted 1139 source: hosted
1140 version: "1.4.0" 1140 version: "1.4.0"
1141 url_launcher_linux: 1141 url_launcher_linux:
@@ -1143,7 +1143,7 @@ packages: @@ -1143,7 +1143,7 @@ packages:
1143 description: 1143 description:
1144 name: url_launcher_linux 1144 name: url_launcher_linux
1145 sha256: "10f86fef4c2c43563fa6c211ff9cf757adf4d3ab762c56bd430664a947d70cd0" 1145 sha256: "10f86fef4c2c43563fa6c211ff9cf757adf4d3ab762c56bd430664a947d70cd0"
1146 - url: "https://pub.flutter-io.cn" 1146 + url: "https://pub.dev"
1147 source: hosted 1147 source: hosted
1148 version: "3.2.3" 1148 version: "3.2.3"
1149 url_launcher_platform_interface: 1149 url_launcher_platform_interface:
@@ -1151,7 +1151,7 @@ packages: @@ -1151,7 +1151,7 @@ packages:
1151 description: 1151 description:
1152 name: url_launcher_platform_interface 1152 name: url_launcher_platform_interface
1153 sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" 1153 sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
1154 - url: "https://pub.flutter-io.cn" 1154 + url: "https://pub.dev"
1155 source: hosted 1155 source: hosted
1156 version: "2.3.2" 1156 version: "2.3.2"
1157 url_launcher_web: 1157 url_launcher_web:
@@ -1159,7 +1159,7 @@ packages: @@ -1159,7 +1159,7 @@ packages:
1159 description: 1159 description:
1160 name: url_launcher_web 1160 name: url_launcher_web
1161 sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" 1161 sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
1162 - url: "https://pub.flutter-io.cn" 1162 + url: "https://pub.dev"
1163 source: hosted 1163 source: hosted
1164 version: "2.4.3" 1164 version: "2.4.3"
1165 url_launcher_windows: 1165 url_launcher_windows:
@@ -1167,7 +1167,7 @@ packages: @@ -1167,7 +1167,7 @@ packages:
1167 description: 1167 description:
1168 name: url_launcher_windows 1168 name: url_launcher_windows
1169 sha256: "6c5ad3f22cd4c38e089b81963b3cd7bb83b111b2df5dce008bb066162f42e429" 1169 sha256: "6c5ad3f22cd4c38e089b81963b3cd7bb83b111b2df5dce008bb066162f42e429"
1170 - url: "https://pub.flutter-io.cn" 1170 + url: "https://pub.dev"
1171 source: hosted 1171 source: hosted
1172 version: "3.1.6" 1172 version: "3.1.6"
1173 uuid: 1173 uuid:
@@ -1175,7 +1175,7 @@ packages: @@ -1175,7 +1175,7 @@ packages:
1175 description: 1175 description:
1176 name: uuid 1176 name: uuid
1177 sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" 1177 sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd"
1178 - url: "https://pub.flutter-io.cn" 1178 + url: "https://pub.dev"
1179 source: hosted 1179 source: hosted
1180 version: "4.6.0" 1180 version: "4.6.0"
1181 vector_math: 1181 vector_math:
@@ -1183,7 +1183,7 @@ packages: @@ -1183,7 +1183,7 @@ packages:
1183 description: 1183 description:
1184 name: vector_math 1184 name: vector_math
1185 sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b 1185 sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
1186 - url: "https://pub.flutter-io.cn" 1186 + url: "https://pub.dev"
1187 source: hosted 1187 source: hosted
1188 version: "2.2.0" 1188 version: "2.2.0"
1189 video_thumbnail: 1189 video_thumbnail:
@@ -1191,7 +1191,7 @@ packages: @@ -1191,7 +1191,7 @@ packages:
1191 description: 1191 description:
1192 name: video_thumbnail 1192 name: video_thumbnail
1193 sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b" 1193 sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b"
1194 - url: "https://pub.flutter-io.cn" 1194 + url: "https://pub.dev"
1195 source: hosted 1195 source: hosted
1196 version: "0.5.6" 1196 version: "0.5.6"
1197 vm_service: 1197 vm_service:
@@ -1199,7 +1199,7 @@ packages: @@ -1199,7 +1199,7 @@ packages:
1199 description: 1199 description:
1200 name: vm_service 1200 name: vm_service
1201 sha256: "5f37239c4851efcef929cea7824e76df7f2f0970aef85d66bbc430afa40e72f0" 1201 sha256: "5f37239c4851efcef929cea7824e76df7f2f0970aef85d66bbc430afa40e72f0"
1202 - url: "https://pub.flutter-io.cn" 1202 + url: "https://pub.dev"
1203 source: hosted 1203 source: hosted
1204 version: "15.3.0" 1204 version: "15.3.0"
1205 watcher: 1205 watcher:
@@ -1207,7 +1207,7 @@ packages: @@ -1207,7 +1207,7 @@ packages:
1207 description: 1207 description:
1208 name: watcher 1208 name: watcher
1209 sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" 1209 sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635"
1210 - url: "https://pub.flutter-io.cn" 1210 + url: "https://pub.dev"
1211 source: hosted 1211 source: hosted
1212 version: "1.2.1" 1212 version: "1.2.1"
1213 web: 1213 web:
@@ -1215,7 +1215,7 @@ packages: @@ -1215,7 +1215,7 @@ packages:
1215 description: 1215 description:
1216 name: web 1216 name: web
1217 sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" 1217 sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
1218 - url: "https://pub.flutter-io.cn" 1218 + url: "https://pub.dev"
1219 source: hosted 1219 source: hosted
1220 version: "1.1.1" 1220 version: "1.1.1"
1221 web_socket: 1221 web_socket:
@@ -1223,7 +1223,7 @@ packages: @@ -1223,7 +1223,7 @@ packages:
1223 description: 1223 description:
1224 name: web_socket 1224 name: web_socket
1225 sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" 1225 sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
1226 - url: "https://pub.flutter-io.cn" 1226 + url: "https://pub.dev"
1227 source: hosted 1227 source: hosted
1228 version: "1.0.1" 1228 version: "1.0.1"
1229 web_socket_channel: 1229 web_socket_channel:
@@ -1231,7 +1231,7 @@ packages: @@ -1231,7 +1231,7 @@ packages:
1231 description: 1231 description:
1232 name: web_socket_channel 1232 name: web_socket_channel
1233 sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 1233 sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
1234 - url: "https://pub.flutter-io.cn" 1234 + url: "https://pub.dev"
1235 source: hosted 1235 source: hosted
1236 version: "3.0.3" 1236 version: "3.0.3"
1237 webview_flutter: 1237 webview_flutter:
@@ -1284,7 +1284,7 @@ packages: @@ -1284,7 +1284,7 @@ packages:
1284 description: 1284 description:
1285 name: win32 1285 name: win32
1286 sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e 1286 sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
1287 - url: "https://pub.flutter-io.cn" 1287 + url: "https://pub.dev"
1288 source: hosted 1288 source: hosted
1289 version: "5.15.0" 1289 version: "5.15.0"
1290 xdg_directories: 1290 xdg_directories:
@@ -1292,7 +1292,7 @@ packages: @@ -1292,7 +1292,7 @@ packages:
1292 description: 1292 description:
1293 name: xdg_directories 1293 name: xdg_directories
1294 sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" 1294 sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
1295 - url: "https://pub.flutter-io.cn" 1295 + url: "https://pub.dev"
1296 source: hosted 1296 source: hosted
1297 version: "1.1.0" 1297 version: "1.1.0"
1298 yaml: 1298 yaml:
@@ -1300,9 +1300,9 @@ packages: @@ -1300,9 +1300,9 @@ packages:
1300 description: 1300 description:
1301 name: yaml 1301 name: yaml
1302 sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea 1302 sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea
1303 - url: "https://pub.flutter-io.cn" 1303 + url: "https://pub.dev"
1304 source: hosted 1304 source: hosted
1305 version: "3.1.4" 1305 version: "3.1.4"
1306 sdks: 1306 sdks:
1307 - dart: ">=3.11.0 <4.0.0" 1307 + dart: ">=3.10.3 <4.0.0"
1308 flutter: ">=3.38.4" 1308 flutter: ">=3.38.4"