Commit 816f8e9f7a8725689534b3e3a8cf969af1326373

Authored by 权海
1 parent 2ec326af

feat(ui):互动接入

feat(ui):移除无用图片

feat(ui):互动记录

feat(ui):互动

feat(ui):完善互动文本显示
... ... @@ -13,6 +13,9 @@ analyzer:
exclude:
- lib/**/*.g.dart
- lib/app/routes/app_routes.dart
- build/**
- android/**
- ios/**
linter:
# The lint rules applied to this project can be customized in the
... ...
... ... @@ -14,6 +14,12 @@ class SelectFriendLogic {
final isLoading = false.obs;
final selectedIndex = (-1).obs;
FriendHealthData? get selectedFriend {
final index = selectedIndex.value;
if (index < 0 || index >= friends.length) return null;
return friends[index];
}
Future<void> initialize() async {
if (isLoading.value) return;
isLoading.value = true;
... ...
import 'package:doublefeel_flutter/app/modules/friends/models/friend_health_data.dart';
import 'package:doublefeel_flutter/core/theme/app_colors.dart';
import 'package:doublefeel_flutter/core/util/size_extensions.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
... ... @@ -8,7 +9,9 @@ import '../controllers/select_friend_logic.dart';
import '../widgets/friend_health_card.dart';
class SelectFriendView extends StatefulWidget {
const SelectFriendView({super.key});
const SelectFriendView({super.key, this.buttonText, this.onConfirm});
final String? buttonText;
final VoidCallback? onConfirm;
@override
State<SelectFriendView> createState() => _SelectFriendViewState();
... ... @@ -42,7 +45,10 @@ class _SelectFriendViewState extends State<SelectFriendView> {
children: [
Column(
children: [
_SelectFriendHeader(onClose: () => Get.back<void>()),
_SelectFriendHeader(
buttonText: widget.buttonText,
onClose: () => Get.back<void>(),
),
Expanded(
child: Obx(() {
if (_logic.isLoading.value && _logic.friends.isEmpty) {
... ... @@ -86,7 +92,7 @@ class _SelectFriendViewState extends State<SelectFriendView> {
left: 49.dp,
right: 49.dp,
bottom: 36.dp + MediaQuery.viewPaddingOf(context).bottom,
child: _SyncButton(onTap: _syncSelectedFriend),
child: _SyncButton(onTap: () => _syncSelectedFriend()),
),
],
),
... ... @@ -94,14 +100,21 @@ class _SelectFriendViewState extends State<SelectFriendView> {
}
Future<void> _syncSelectedFriend() async {
if (widget.onConfirm != null) {
widget.onConfirm!();
final friend = _logic.selectedFriend;
Get.back(result: friend);
return;
}
final selectedFriend = await _logic.syncSelectedFriendToWatchFace();
Get.back(result: selectedFriend);
}
}
class _SelectFriendHeader extends StatelessWidget {
const _SelectFriendHeader({required this.onClose});
const _SelectFriendHeader({required this.onClose, this.buttonText});
final String? buttonText;
final VoidCallback onClose;
@override
... ... @@ -119,11 +132,7 @@ class _SelectFriendHeader extends StatelessWidget {
width: 40.dp,
height: 40.dp,
child: const Center(
child: Icon(
Icons.close,
color: AppColors.primary,
size: 20,
),
child: Icon(Icons.close, color: AppColors.primary, size: 20),
),
),
),
... ... @@ -131,7 +140,7 @@ class _SelectFriendHeader extends StatelessWidget {
Expanded(
child: Center(
child: Text(
context.l10n.friendsSelect,
buttonText ?? context.l10n.friendsSelect,
style: const TextStyle(
color: AppColors.textPrimary,
fontSize: 16,
... ...
... ... @@ -10,11 +10,32 @@ import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/data/models/interaction/interaction_models.dart';
import 'package:doublefeel_flutter/data/models/user/user_models.dart';
import 'package:flutter/foundation.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:get/get.dart';
enum InteractAction { stick, miss, punch }
extension InteractionDataActionInteractAction on InteractionDataAction {
/// Converts the action identifier returned in interaction data to the UI
/// action used by the interaction page. Unknown server values are ignored.
InteractAction? get interactAction => switch (action?.trim().toLowerCase()) {
'poke' || 'stick' => InteractAction.stick,
'miss' => InteractAction.miss,
'punch' => InteractAction.punch,
_ => null,
};
}
extension InteractionRecordInteractAction on InteractionRecord {
/// Record payloads identify the interaction by the numeric [actionType].
InteractAction? get interactAction => switch (actionType) {
0 => InteractAction.stick,
1 => InteractAction.miss,
2 => InteractAction.punch,
_ => null,
};
}
extension InteractActionUi on InteractAction {
static const animationDuration = Duration(seconds: 5);
... ... @@ -33,21 +54,11 @@ extension InteractActionUi on InteractAction {
bool get needsVip => this != InteractAction.stick;
String get iconAsset => switch (this) {
InteractAction.stick => 'assets/images/interact/icon_stick.png',
InteractAction.miss => 'assets/images/interact/icon_miss.png',
InteractAction.punch => 'assets/images/interact/icon_punch.png',
};
String get titleAsset => switch (this) {
InteractAction.stick => 'assets/images/interact/title_stick.png',
InteractAction.miss => 'assets/images/interact/title_miss.png',
InteractAction.punch => 'assets/images/interact/title_punch.png',
};
String get lockedTitleAsset => switch (this) {
InteractAction.stick => 'assets/images/interact/title_stick_locked.png',
InteractAction.miss => 'assets/images/interact/title_miss_locked.png',
InteractAction.punch => 'assets/images/interact/title_punch_locked.png',
InteractAction.stick =>
'assets/images/interact/ic_friend_interact_poke.png',
InteractAction.miss => 'assets/images/interact/ic_friend_interact_miss.png',
InteractAction.punch =>
'assets/images/interact/ic_friend_interact_punch.png',
};
String get lottieAsset => switch (this) {
... ... @@ -89,7 +100,6 @@ class InteractController extends GetxController {
UserInfoResponse? get partner => selectedFriend.value == null
? _userPreferencesStorage.preferences.value.partnerUserInfo
: null;
bool get isPaired => targetFriendUserId.value != null || partner?.id != null;
bool get isInteractionLocked =>
sendingAction.value != null || activeAction.value != null;
bool get isVip =>
... ... @@ -210,17 +220,9 @@ class InteractController extends GetxController {
isLoading.value = false;
switch (result) {
case AppSuccess(:final data):
final responseRecords = data.records ?? const <InteractionRecord>[];
records.assignAll(
kDebugMode && responseRecords.isEmpty
? _mockRecords()
: responseRecords,
);
records.assignAll(data.records ?? const <InteractionRecord>[]);
case AppFailure():
if (kDebugMode) {
records.assignAll(_mockRecords());
}
// Keep the last successful list visible in release when a refresh fails.
// Keep the last successful list visible when a refresh fails.
}
}
... ... @@ -228,11 +230,6 @@ class InteractController extends GetxController {
InteractAction action, {
InteractionDataAction? actionVariables,
}) async {
if (!isPaired) {
_showToast('请先绑定另一半');
Get.toNamed(AppRoutes.bindPartner);
return;
}
if (action.needsVip && !isVip) {
_showToast('${action.title}为会员互动,请先开通会员');
Get.toNamed(Routes.PURCHASE);
... ... @@ -241,7 +238,6 @@ class InteractController extends GetxController {
if (isInteractionLocked) return;
final friendUserId = targetFriendUserId.value;
if (friendUserId == null) {
_showToast('未找到互动好友');
return;
}
... ... @@ -269,35 +265,41 @@ class InteractController extends GetxController {
}
}
String barrageText(InteractionRecord record) {
final isSelf = record.userId == me?.id;
return switch (record.actionType) {
0 => isSelf ? '我戳Ta一下~' : 'Ta戳我一下~',
1 => isSelf ? '我想了Ta一次~' : 'Ta想了我一次~',
2 => isSelf ? '我打了Ta一拳~' : 'Ta打了我一拳~',
_ => isSelf ? '我发起了一次互动~' : 'Ta发起了一次互动~',
};
}
String barrageText(InteractionRecord record) => record.danmuText ?? '';
InteractionRecordLine recordLine(InteractionRecord record) {
final isSelf = record.userId == me?.id;
final actor = isSelf ? '我' : friendLabel;
final target = isSelf ? friendLabel : '你';
final (verb, suffix) = switch (record.actionType) {
0 => ('戳了戳', '~'),
1 => ('想了', '一次~'),
2 => ('打了', '一拳~'),
_ => ('发起了', '一次互动~'),
};
final sentByMe = _isSentByMe(record);
return InteractionRecordLine(
actor: actor,
verb: verb,
target: target,
suffix: suffix,
highlightTarget: isSelf,
template: l10n.interactRecordTextTemplate(
sentByMe: sentByMe,
action: record.interactAction?.name,
interactionType: record.interactionType,
),
actor: sentByMe ? l10n.interactRecordSelf : friendInteractionName,
target: record.interactionType == 100
? friendInteractionName
: sentByMe
? friendInteractionName
: l10n.interactRecordYou,
actionTarget: l10n.interactRecordTargetPronoun(sentByMe),
);
}
bool _isSentByMe(InteractionRecord record) {
final selfUserId = me?.id;
if (selfUserId == null) return false;
if (record.userId == selfUserId) return true;
if (record.friendUserId == selfUserId) return false;
return false;
}
String get friendInteractionName {
final remark = friendRemark?.trim();
return remark == null || remark.isEmpty
? friendName
: '$remark($friendName)';
}
String recordTime(InteractionRecord record) {
final timestamp = record.createTime;
if (timestamp == null || timestamp <= 0) return '';
... ... @@ -311,57 +313,27 @@ class InteractController extends GetxController {
void _showToast(String message) {
Get.snackbar('互动', message, snackPosition: SnackPosition.BOTTOM);
}
List<InteractionRecord> _mockRecords() {
final now = DateTime.now();
final meId = me?.id ?? 1;
final friendId = targetFriendUserId.value ?? 2;
const texts = <String>[
'我戳了戳Ta一下~',
'Ta打了你一拳~',
'我想Ta了,今天也要好好照顾自己呀~',
'Ta戳了戳你,提醒你起来活动一下。',
'我送给Ta一份今天的好心情~',
'Ta想你了,记得给Ta一个回应。',
'我打了一拳,今天也要元气满满!',
'Ta戳了戳你,别忘了喝水。',
'我想念Ta,晚点一起聊聊天吧。',
'Ta送来一份鼓励:今天辛苦了!',
'我戳了戳Ta,继续加油~',
'Ta打了一拳,是轻轻的一拳。',
'我想Ta了。',
'Ta戳了戳你。',
'我送给Ta一个拥抱。',
];
return List<InteractionRecord>.generate(
texts.length,
(index) => InteractionRecord(
id: index + 1,
userId: index.isEven ? meId : friendId,
actionType: index % 3,
text: texts[index],
createTime:
now
.subtract(Duration(minutes: index * 17 + 3))
.millisecondsSinceEpoch ~/
Duration.millisecondsPerSecond,
),
);
}
}
class InteractionRecordLine {
static const actorToken = '##A##';
static const targetToken = '##B##';
static const actionTargetToken = '##C##';
const InteractionRecordLine({
required this.template,
required this.actor,
required this.verb,
required this.target,
required this.suffix,
required this.highlightTarget,
required this.actionTarget,
});
final String template;
final String actor;
final String verb;
final String target;
final String suffix;
final bool highlightTarget;
final String actionTarget;
String get text => template
.replaceAll(actorToken, actor)
.replaceAll(targetToken, target)
.replaceAll(actionTargetToken, actionTarget);
}
... ...
... ... @@ -156,68 +156,58 @@ class InteractView extends GetView<InteractController> {
required bool elevated,
}) {
final isLocked = controller.isInteractionLocked;
final enabled =
!isLocked &&
controller.isPaired &&
(!action.needsVip || controller.isVip);
final enabled = !isLocked && (!action.needsVip || controller.isVip);
final sending = controller.sendingAction.value == action;
return GestureDetector(
onLongPress: isLocked ? null : () => _showActionSheet(context),
onTap: isLocked ? null : () => controller.sendAction(action),
child: SizedBox(
width: width,
height: 112,
child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.topCenter,
children: [
Positioned(
top: elevated ? 34 : 49,
child: Opacity(
opacity: enabled ? 1 : .4,
child: Opacity(
opacity: enabled ? 1 : .4,
child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.topCenter,
children: [
Positioned(
top: elevated ? 34 : 49,
child: Material(
color: _purple,
borderRadius: BorderRadius.circular(elevated ? 24 : 16),
child: InkWell(
onTap: sending ? null : () => controller.sendAction(action),
borderRadius: BorderRadius.circular(elevated ? 24 : 16),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(elevated ? 24 : 16),
),
child: SizedBox(
width: width,
height: elevated ? 78 : 56,
child: Center(
child: sending
? const SizedBox(
width: 22,
height: 22,
child: CircularProgressIndicator(
color: Colors.white,
strokeWidth: 2,
),
)
? null
: Text(
action.title,
style: TextStyle(
color: Colors.white,
fontSize: elevated ? 20 : 14,
fontSize: elevated ? 20 : 16,
fontWeight: FontWeight.w600,
),
),
).paddingOnly(top: elevated ? 24 : 16),
),
),
),
),
),
),
Positioned(
top: elevated ? 0 : 19,
child: _colorPlaceholder(
elevated ? 68 : 52,
color: enabled
? const Color(0xffc5b0ff)
: const Color(0xffd5cfe3),
radius: elevated ? 22 : 18,
Positioned(
top: elevated ? 0 : 19,
child: SizedBox(
width: elevated ? 68 : 52,
height: elevated ? 68 : 52,
child: Image.asset(action.iconAsset),
),
),
),
],
],
),
),
),
);
... ... @@ -303,17 +293,7 @@ class InteractView extends GetView<InteractController> {
Text.rich(
TextSpan(
style: bodyStyle,
children: [
TextSpan(text: line.actor, style: highlightStyle),
TextSpan(text: ' ${line.verb} '),
TextSpan(
text: line.target,
style: line.highlightTarget
? highlightStyle
: bodyStyle,
),
TextSpan(text: line.suffix),
],
children: _recordTextSpans(line, highlightStyle),
),
),
const SizedBox(height: 3),
... ... @@ -333,28 +313,45 @@ class InteractView extends GetView<InteractController> {
);
}
void _onRecordTap(InteractionRecord record) {
// TODO: open the corresponding interaction-detail page.
List<InlineSpan> _recordTextSpans(
InteractionRecordLine line,
TextStyle highlightStyle,
) {
final tokenPattern = RegExp(r'##[ABC]##');
final spans = <InlineSpan>[];
var cursor = 0;
for (final match in tokenPattern.allMatches(line.template)) {
if (match.start > cursor) {
spans.add(TextSpan(text: line.template.substring(cursor, match.start)));
}
final token = match.group(0)!;
final (text, isHighlighted) = switch (token) {
InteractionRecordLine.actorToken => (line.actor, true),
InteractionRecordLine.targetToken => (line.target, true),
InteractionRecordLine.actionTargetToken => (line.actionTarget, false),
_ => ('', false),
};
spans.add(
TextSpan(text: text, style: isHighlighted ? highlightStyle : null),
);
cursor = match.end;
}
if (cursor < line.template.length) {
spans.add(TextSpan(text: line.template.substring(cursor)));
}
return spans;
}
Widget _colorPlaceholder(
double size, {
required Color color,
required double radius,
}) {
return Container(
width: size,
height: size,
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(radius),
),
);
void _onRecordTap(InteractionRecord record) {
// TODO: open the corresponding interaction-detail page.
}
Future<void> _changeFriend() async {
final selectedFriend = await Get.bottomSheet<FriendHealthData>(
SizedBox(height: Get.height * 0.9, child: const SelectFriendView()),
SizedBox(
height: Get.height * 0.9,
child: SelectFriendView(buttonText: '确定', onConfirm: () => const {}),
),
ignoreSafeArea: false,
isScrollControlled: true,
backgroundColor: Colors.transparent,
... ... @@ -366,14 +363,6 @@ class InteractView extends GetView<InteractController> {
}
await controller.selectFriend(selectedFriend);
}
void _showActionSheet(BuildContext context) {
Get.bottomSheet(
InteractActionBottomSheet(controller: controller),
isScrollControlled: true,
backgroundColor: Colors.transparent,
);
}
}
/// Coordinates the three visual containers for one interaction. The self
... ... @@ -683,11 +672,13 @@ class _FloatingInteractionBubblesState
@override
Widget build(BuildContext context) {
final selfUserId = widget.selfUserId;
if (selfUserId == null) return const SizedBox.shrink();
final selfRecords = widget.records
.where((record) => record.userId == widget.selfUserId)
.where((record) => record.userId == selfUserId)
.toList(growable: false);
final friendRecords = widget.records
.where((record) => record.userId != widget.selfUserId)
.where((record) => record.friendUserId == selfUserId)
.toList(growable: false);
return LayoutBuilder(
builder: (context, constraints) => AnimatedBuilder(
... ... @@ -766,7 +757,10 @@ class _FloatingInteractionBubblesState
}
double _bubbleWidth(InteractionRecord record) {
const horizontalPadding = 6.0 + 28 + 5 + 10;
// Keep this in sync with [_FloatingInteractionBubble]'s horizontal
// padding, icon, and spacing. The old value omitted 10px of right
// padding, so server-provided danmu text could overflow its bubble.
const horizontalContent = 6.0 + 28 + 5 + 20;
final textPainter = TextPainter(
text: TextSpan(
text: widget.recordText(record),
... ... @@ -775,7 +769,7 @@ class _FloatingInteractionBubblesState
maxLines: 1,
textDirection: TextDirection.ltr,
)..layout();
return horizontalPadding + textPainter.width;
return horizontalContent + textPainter.width + 2;
}
}
... ... @@ -792,6 +786,7 @@ class _FloatingInteractionBubble extends StatelessWidget {
@override
Widget build(BuildContext context) {
final action = record.interactAction;
return Container(
width: width,
padding: const EdgeInsets.fromLTRB(6, 4, 20, 4),
... ... @@ -805,155 +800,19 @@ class _FloatingInteractionBubble extends StatelessWidget {
SizedBox(
width: 28,
height: 28,
child: Image.asset('named_assets/interact/icon_bubble_avatar.png'),
child: action == null
? const SizedBox.shrink()
: Image.asset(action.iconAsset),
),
const SizedBox(width: 5),
Flexible(
child: Text(
recordText(record),
maxLines: 1,
overflow: TextOverflow.visible,
style: const TextStyle(color: Colors.white, fontSize: 12),
),
Text(
recordText(record),
maxLines: 1,
overflow: TextOverflow.visible,
style: const TextStyle(color: Colors.white, fontSize: 12),
),
],
),
);
}
}
class InteractActionBottomSheet extends StatelessWidget {
const InteractActionBottomSheet({required this.controller, super.key});
final InteractController controller;
@override
Widget build(BuildContext context) {
return SafeArea(
top: false,
child: Container(
height: 331,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/interact/bottom_sheet_bg.png'),
fit: BoxFit.fill,
),
),
child: Stack(
children: [
Align(
alignment: const Alignment(.2, -.98),
child: Image.asset(
'assets/images/interact/bottom_sheet_label.png',
width: 126,
),
),
Column(
children: [
const SizedBox(height: 18),
_sheetAvatar(),
const SizedBox(height: 13),
const Text(
'给搭子送去一份互动',
style: TextStyle(color: Color(0xff908b91), fontSize: 14),
),
const SizedBox(height: 3),
const Text(
'想念要说出来',
style: TextStyle(
color: Color(0xff896cdc),
fontSize: 24,
fontWeight: FontWeight.w700,
),
),
const SizedBox(height: 24),
Obx(
() => Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: InteractAction.values
.map(
(action) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 6),
child: _sheetButton(action),
),
)
.toList(growable: false),
),
),
],
),
],
),
),
);
}
Widget _sheetAvatar() {
final avatar = controller.partner?.avatar;
return Container(
width: 56,
height: 56,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: const Color(0xff896cdc), width: 2),
),
child: avatar == null || avatar.isEmpty
? const Icon(Icons.person, color: Color(0xff908b91))
: Image.network(avatar, fit: BoxFit.cover),
);
}
Widget _sheetButton(InteractAction action) {
final enabled =
!controller.isInteractionLocked &&
controller.isPaired &&
(!action.needsVip || controller.isVip);
final sending = controller.sendingAction.value == action;
return SizedBox(
width: action == InteractAction.stick ? 112 : 88,
height: action == InteractAction.stick ? 74 : 56,
child: ElevatedButton(
onPressed: !enabled || sending
? null
: () async {
await controller.sendAction(
action,
actionVariables: const InteractionDataAction(objectTarget: 2),
);
if (controller.sendingAction.value == null) Get.back();
},
style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero,
backgroundColor: const Color(
0xff896cdc,
).withValues(alpha: enabled ? 1 : .4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(28),
),
),
child: sending
? const CircularProgressIndicator(
color: Colors.white,
strokeWidth: 2,
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
enabled
? action.iconAsset
: 'assets/images/interact/icon_locked.png',
height: 38,
),
Image.asset(
enabled ? action.titleAsset : action.lockedTitleAsset,
height: 18,
),
],
),
),
);
}
}
... ...
... ... @@ -114,27 +114,34 @@ class InteractionRecord {
this.id,
this.createTime,
this.userId,
this.friendUserId,
this.pairId,
this.interactionType,
this.actionType,
this.action,
this.text,
this.danmuText,
});
final int? id;
final int? createTime;
/// The interaction recipient. [userId] is the initiator.
final int? userId;
final int? friendUserId;
final int? pairId;
final int? interactionType;
final int? actionType;
final InteractionDataAction? action;
final String? text;
final String? danmuText;
factory InteractionRecord.fromJson(Map<String, dynamic> json) {
return InteractionRecord(
id: json['id'] as int?,
createTime: json['create_time'] as int?,
userId: json['user_id'] as int?,
friendUserId: json['friend_user_id'] as int?,
pairId: json['pair_id'] as int?,
interactionType: json['interaction_type'] as int?,
actionType: json['action_type'] as int?,
... ... @@ -144,6 +151,7 @@ class InteractionRecord {
json['action_variables'] as Map<String, dynamic>,
),
text: json['text'] as String?,
danmuText: json['danmu_text'] as String?,
);
}
... ... @@ -152,11 +160,13 @@ class InteractionRecord {
if (id != null) val['id'] = id;
if (createTime != null) val['create_time'] = createTime;
if (userId != null) val['user_id'] = userId;
if (friendUserId != null) val['friend_user_id'] = friendUserId;
if (pairId != null) val['pair_id'] = pairId;
if (interactionType != null) val['interaction_type'] = interactionType;
if (actionType != null) val['action_type'] = actionType;
if (action != null) val['action_variables'] = action!.toJson();
if (text != null) val['text'] = text;
if (danmuText != null) val['danmu_text'] = danmuText;
return val;
}
}
... ...
... ... @@ -118,6 +118,249 @@ extension InteractionAppLocalizations on AppLocalizations {
};
}
String get interactRecordSelf => switch (localeName) {
'zh' || 'zh_Hans' || 'zh_Hant' => '我',
'ja' => '私',
'ko' => '나',
'de' => 'Ich',
'es' => 'Yo',
'fil' => 'Ako',
'fr' => 'Je',
'hi' => 'मैं',
'it' => 'Io',
'nl' => 'Ik',
'pt' || 'pt_BR' || 'pt_PT' => 'Eu',
'ru' => 'Я',
'tr' => 'Ben',
_ => 'I',
};
String get interactRecordYou => switch (localeName) {
'zh' || 'zh_Hans' || 'zh_Hant' => '你',
'ja' => 'あなた',
'ko' => '너',
'de' => 'dich',
'es' => 'ti',
'fil' => 'ikaw',
'fr' => 'toi',
'hi' => 'तुम्हें',
'it' => 'te',
'nl' => 'jou',
'pt' || 'pt_BR' || 'pt_PT' => 'você',
'ru' => 'тебя',
'tr' => 'seni',
_ => 'you',
};
String interactRecordTargetPronoun(bool sentByMe) {
if (!sentByMe) return interactRecordYou;
return switch (localeName) {
'zh' || 'zh_Hans' || 'zh_Hant' => 'Ta',
'ja' => '相手',
'ko' => '상대',
'de' => 'sie',
'es' => 'esa persona',
'fil' => 'siya',
'fr' => 'cette personne',
'hi' => 'उन्हें',
'it' => 'loro',
'nl' => 'hen',
'pt' || 'pt_BR' || 'pt_PT' => 'essa pessoa',
'ru' => 'его/её',
'tr' => 'onu',
_ => 'them',
};
}
/// Localized record text. ##A## is actor, ##B## is the highlighted target,
/// and ##C## is the plain-language action target.
String interactRecordTextTemplate({
required bool sentByMe,
required String? action,
required int? interactionType,
}) {
if (interactionType == 100) {
return _recordTemplate(
action: action,
scene: null,
sentByMe: sentByMe,
useHighlightedTarget: true,
);
}
final sceneTitle = _recordSceneTitle(interactionType);
final scene = sceneTitle == null ? null : interactSceneTitle(sceneTitle);
return _recordTemplate(action: action, scene: scene, sentByMe: sentByMe);
}
InteractionSceneTitle? _recordSceneTitle(int? type) => switch (type) {
100 || null => null,
101 => InteractionSceneTitle.todayAverageHrv,
102 => InteractionSceneTitle.todayRestingHeartRate,
103 => InteractionSceneTitle.todaySleepStatus,
104 => InteractionSceneTitle.todayFitnessStatus,
105 => InteractionSceneTitle.weekStressTrend,
106 => InteractionSceneTitle.monthStressTrend,
107 => InteractionSceneTitle.yearStressTrend,
108 => InteractionSceneTitle.todayActivityBurn,
109 => InteractionSceneTitle.weekActivityBurn,
110 => InteractionSceneTitle.monthActivityBurn,
111 => InteractionSceneTitle.todaySleepStatus,
112 => InteractionSceneTitle.weekSleepTime,
113 => InteractionSceneTitle.monthSleepTime,
114 => InteractionSceneTitle.pkSteps,
115 => InteractionSceneTitle.pkCalories,
116 => InteractionSceneTitle.pkStandTime,
117 => InteractionSceneTitle.pkMonthlyResult,
_ => null,
};
String _recordTemplate({
required String? action,
required String? scene,
required bool sentByMe,
bool useHighlightedTarget = false,
}) {
final verb = _recordActionVerb(action);
final actionSuffix = _recordActionSuffix(action);
final actionTargetToken = useHighlightedTarget ? '##B##' : '##C##';
final defaultText = switch (localeName) {
'zh' ||
'zh_Hans' ||
'zh_Hant' => '##A##$verb$actionTargetToken$actionSuffix~',
'ja' => '##A##が$actionTargetToken$verb~',
'ko' => '##A## $actionTargetToken을(를) $verb~',
'de' => '##A## hat $actionTargetToken $verb~',
'es' => '##A## $verb a $actionTargetToken~',
'fil' => '##A## ay $verb si $actionTargetToken~',
'fr' => '##A## a $verb $actionTargetToken~',
'hi' => '##A## ने $actionTargetToken को $verb~',
'it' => '##A## ha $verb $actionTargetToken~',
'nl' => '##A## heeft $actionTargetToken $verb~',
'pt' || 'pt_BR' || 'pt_PT' => '##A## $verb $actionTargetToken~',
'ru' => '##A## $verb $actionTargetToken~',
'tr' => '##A## $actionTargetToken $verb~',
_ => '##A## $verb $actionTargetToken~',
};
if (scene == null) return defaultText;
return switch (localeName) {
'zh' ||
'zh_Hans' ||
'zh_Hant' => '##A## 看了##B##的【$scene】,并$verb##C##$actionSuffix~',
'ja' => '##A##が##B##の【$scene】を見て、##C##を$verb~',
'ko' => '##A## ##B##의【$scene】을 보고 ##C##을(를) $verb~',
'de' => '##A## hat ##B##s [$scene] angesehen und ##C## $verb~',
'es' => '##A## vio [$scene] de ##B## y $verb a ##C##~',
'fil' => '##A## ay tiningnan ang [$scene] ni ##B## at $verb si ##C##~',
'fr' => '##A## a vu le [$scene] de ##B## et a $verb ##C##~',
'hi' => '##A## ने ##B## का [$scene] देखा और ##C## को $verb~',
'it' => '##A## ha visto [$scene] di ##B## e ha $verb ##C##~',
'nl' => '##A## bekeek [$scene] van ##B## en heeft ##C## $verb~',
'pt' ||
'pt_BR' ||
'pt_PT' => '##A## viu [$scene] de ##B## e $verb ##C##~',
'ru' => '##A## посмотрел(а) [$scene] ##B## и $verb ##C##~',
'tr' =>
'##A##, ##B## adlı kişinin [$scene] verisini gördü ve ##C## $verb~',
_ => '##A## viewed ##B##\'s [$scene] and $verb ##C##~',
};
}
String _recordActionVerb(String? action) => switch (localeName) {
'zh' || 'zh_Hans' || 'zh_Hant' => switch (action) {
'stick' => '戳了戳',
'miss' => '想了',
'punch' => '打了',
_ => '互动了',
},
'ja' => switch (action) {
'stick' => 'つついた',
'miss' => '会いたくなった',
'punch' => 'パンチした',
_ => '交流した',
},
'ko' => switch (action) {
'stick' => '콕 찔렀다',
'miss' => '그리워했다',
'punch' => '주먹으로 쳤다',
_ => '상호작용했다',
},
'de' => switch (action) {
'stick' => 'angestupst',
'miss' => 'vermisst',
'punch' => 'geboxt',
_ => 'kontaktiert',
},
'es' => switch (action) {
'stick' => 'dio un toque',
'miss' => 'extrañó',
'punch' => 'golpeó',
_ => 'interactuó con',
},
'fil' => switch (action) {
'stick' => 'tinapik',
'miss' => 'na-miss',
'punch' => 'sinuntok',
_ => 'nakipag-ugnayan kay',
},
'fr' => switch (action) {
'stick' => 'taquiné',
'miss' => 'manqué à',
'punch' => 'donné un coup de poing à',
_ => 'interagi avec',
},
'hi' => switch (action) {
'stick' => 'हल्का धक्का दिया',
'miss' => 'याद किया',
'punch' => 'मुक्का मारा',
_ => 'इंटरैक्ट किया',
},
'it' => switch (action) {
'stick' => 'stuzzicato',
'miss' => 'sentito la mancanza di',
'punch' => 'dato un pugno a',
_ => 'interagito con',
},
'nl' => switch (action) {
'stick' => 'geprikt',
'miss' => 'gemist',
'punch' => 'gestoten',
_ => 'contact gehad met',
},
'pt' || 'pt_BR' || 'pt_PT' => switch (action) {
'stick' => 'cutucou',
'miss' => 'sentiu saudade de',
'punch' => 'deu um soco em',
_ => 'interagiu com',
},
'ru' => switch (action) {
'stick' => 'ткнул(а)',
'miss' => 'скучал(а) по',
'punch' => 'ударил(а)',
_ => 'взаимодействовал(а) с',
},
'tr' => switch (action) {
'stick' => 'dürttü',
'miss' => 'özledi',
'punch' => 'yumrukladı',
_ => 'etkileşime geçti',
},
_ => switch (action) {
'stick' => 'poked',
'miss' => 'missed',
'punch' => 'punched',
_ => 'interacted with',
},
};
String _recordActionSuffix(String? action) => switch (localeName) {
'zh' || 'zh_Hans' || 'zh_Hant' => switch (action) {
'punch' => '一拳',
'miss' => '一次',
_ => '',
},
_ => '',
};
String get interactActionSheetInvitation => _interactionStrings.$1;
String get interactTodaySteps => _interactionStrings.$2;
String get interactStepsUnit => _interactionStrings.$3;
... ...
... ... @@ -6,7 +6,7 @@ packages:
description:
name: _fe_analyzer_shared
sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "85.0.0"
analyzer:
... ... @@ -14,23 +14,23 @@ packages:
description:
name: analyzer
sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "7.7.1"
archive:
dependency: transitive
description:
name: archive
sha256: ace891da0862b0e4cabbb064ee3fd87b2728b898949fdb366d83fe98342c9f19
url: "https://pub.flutter-io.cn"
sha256: "6c5bcd986e06b94e3c40244af471750840a3d2341d1f9763a1100a14add517b4"
url: "https://pub.dev"
source: hosted
version: "4.2.0"
version: "4.3.0"
args:
dependency: transitive
description:
name: args
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.7.0"
async:
... ... @@ -38,7 +38,7 @@ packages:
description:
name: async
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.13.1"
boolean_selector:
... ... @@ -46,7 +46,7 @@ packages:
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
build:
... ... @@ -54,7 +54,7 @@ packages:
description:
name: build
sha256: "825fed4d63050252a0b6e74f2d75844c4a85b664814be6993bd3493fb5239779"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.0.1"
build_config:
... ... @@ -62,23 +62,23 @@ packages:
description:
name: build_config
sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
build_daemon:
dependency: transitive
description:
name: build_daemon
sha256: e1d40ef3f7934986d5da2271b1ba07794921ce263e44d622fb6c406d76589e33
url: "https://pub.flutter-io.cn"
sha256: fd754058c342243718d5171a95f352cfc9fcf0cba8cfa26df67cb13a5836db78
url: "https://pub.dev"
source: hosted
version: "4.1.6"
version: "4.1.2"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
built_collection:
... ... @@ -86,7 +86,7 @@ packages:
description:
name: built_collection
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.1.1"
built_value:
... ... @@ -94,7 +94,7 @@ packages:
description:
name: built_value
sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "8.13.0"
cached_network_image:
... ... @@ -102,7 +102,7 @@ packages:
description:
name: cached_network_image
sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.4.1"
cached_network_image_platform_interface:
... ... @@ -110,7 +110,7 @@ packages:
description:
name: cached_network_image_platform_interface
sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.1.1"
cached_network_image_web:
... ... @@ -118,7 +118,7 @@ packages:
description:
name: cached_network_image_web
sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
characters:
... ... @@ -126,7 +126,7 @@ packages:
description:
name: characters
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
checked_yaml:
... ... @@ -134,7 +134,7 @@ packages:
description:
name: checked_yaml
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.0.4"
clock:
... ... @@ -142,7 +142,7 @@ packages:
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
code_assets:
... ... @@ -150,7 +150,7 @@ packages:
description:
name: code_assets
sha256: cfd4f5f575a49c5f10ca856e9846073f1e6c3ee94912377eea5f6cefc5272941
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
code_builder:
... ... @@ -158,7 +158,7 @@ packages:
description:
name: code_builder
sha256: aa5932e94c6c39c2f9ec4e5e06dfdd11a9430a61f6c41b6ba75b28ce0c481baf
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.12.0"
collection:
... ... @@ -166,7 +166,7 @@ packages:
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.19.1"
convert:
... ... @@ -174,7 +174,7 @@ packages:
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
cross_file:
... ... @@ -182,7 +182,7 @@ packages:
description:
name: cross_file
sha256: f141ea4f277af142a0356955707f6556f37b03947d39d55585981a06ca437bd6
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.3.5+5"
crypto:
... ... @@ -190,7 +190,7 @@ packages:
description:
name: crypto
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.7"
cupertino_icons:
... ... @@ -198,7 +198,7 @@ packages:
description:
name: cupertino_icons
sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.9"
dart_style:
... ... @@ -206,7 +206,7 @@ packages:
description:
name: dart_style
sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
dio:
... ... @@ -214,7 +214,7 @@ packages:
description:
name: dio
sha256: "852ec3b48cc431ac04fff978413c541502b67ffc3e26921e74e3d994694192c1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.11.1"
dio_web_adapter:
... ... @@ -222,7 +222,7 @@ packages:
description:
name: dio_web_adapter
sha256: "3a1b2cd7be71086f38504956e3ebcd2837288d231ff454bafa78021244102bfc"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
equatable:
... ... @@ -230,7 +230,7 @@ packages:
description:
name: equatable
sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
fake_async:
... ... @@ -238,7 +238,7 @@ packages:
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
ffi:
... ... @@ -246,7 +246,7 @@ packages:
description:
name: ffi
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
file:
... ... @@ -254,7 +254,7 @@ packages:
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "7.0.1"
file_selector_linux:
... ... @@ -262,7 +262,7 @@ packages:
description:
name: file_selector_linux
sha256: da76400e7872ce7637ffdce12749ec24169c25f6195c28372208e65a24bcd2ab
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.4+1"
file_selector_macos:
... ... @@ -270,7 +270,7 @@ packages:
description:
name: file_selector_macos
sha256: d57c62362766b5e7ae739448650b66c6aab7a68ba7ecc65e04018652645ae0f4
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.5+1"
file_selector_platform_interface:
... ... @@ -278,7 +278,7 @@ packages:
description:
name: file_selector_platform_interface
sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.7.0"
file_selector_windows:
... ... @@ -286,7 +286,7 @@ packages:
description:
name: file_selector_windows
sha256: fbefc5fb92c6d3cbe8d284a2cd971b593bb07d2cd6da8557b81a862250b4acec
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.9.3+6"
fixnum:
... ... @@ -294,7 +294,7 @@ packages:
description:
name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
fl_chart:
... ... @@ -302,7 +302,7 @@ packages:
description:
name: fl_chart
sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.70.2"
flutter:
... ... @@ -315,7 +315,7 @@ packages:
description:
name: flutter_cache_manager
sha256: "1de7849213b4c73c85aca7e0ac687a9a5d82ccdb594366b9dcc26cb6a2189cd2"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.4.2"
flutter_lints:
... ... @@ -323,7 +323,7 @@ packages:
description:
name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.0.0"
flutter_localizations:
... ... @@ -336,7 +336,7 @@ packages:
description:
name: flutter_plugin_android_lifecycle
sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.0.35"
flutter_test:
... ... @@ -349,7 +349,7 @@ packages:
description:
name: flutter_timezone
sha256: "869677426fde92dbe170fb7d2d4929f2a8343c2f5f62f08b0bb64f908630b073"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.1.0"
flutter_web_plugins:
... ... @@ -371,7 +371,7 @@ packages:
description:
name: get
sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.7.3"
glob:
... ... @@ -379,7 +379,7 @@ packages:
description:
name: glob
sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
graphs:
... ... @@ -387,7 +387,7 @@ packages:
description:
name: graphs
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
hooks:
... ... @@ -395,7 +395,7 @@ packages:
description:
name: hooks
sha256: eaac480a35ec0814146c2c48d96aaa829e0e44a7662c88ae84c9edf4bc35651f
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
http:
... ... @@ -403,7 +403,7 @@ packages:
description:
name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.6.0"
http_multi_server:
... ... @@ -411,7 +411,7 @@ packages:
description:
name: http_multi_server
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.2.2"
http_parser:
... ... @@ -419,7 +419,7 @@ packages:
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
image_cropper:
... ... @@ -463,7 +463,7 @@ packages:
description:
name: image_picker_android
sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.8.13+17"
image_picker_for_web:
... ... @@ -471,7 +471,7 @@ packages:
description:
name: image_picker_for_web
sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
image_picker_ios:
... ... @@ -479,7 +479,7 @@ packages:
description:
name: image_picker_ios
sha256: ee3885b6fcd71958fbc79770dd194c63371439d536d69c47b279171a486482ae
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.8.13+7"
image_picker_linux:
... ... @@ -487,7 +487,7 @@ packages:
description:
name: image_picker_linux
sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
image_picker_macos:
... ... @@ -495,7 +495,7 @@ packages:
description:
name: image_picker_macos
sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2+1"
image_picker_ohos:
... ... @@ -512,7 +512,7 @@ packages:
description:
name: image_picker_platform_interface
sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.11.1"
image_picker_windows:
... ... @@ -520,7 +520,7 @@ packages:
description:
name: image_picker_windows
sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
intl:
... ... @@ -528,7 +528,7 @@ packages:
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.20.2"
io:
... ... @@ -536,7 +536,7 @@ packages:
description:
name: io
sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
jni:
... ... @@ -544,7 +544,7 @@ packages:
description:
name: jni
sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.3"
jni_flutter:
... ... @@ -552,7 +552,7 @@ packages:
description:
name: jni_flutter
sha256: b2310cdd4c18c65c081ab141a41efa94aa26c65431803703ece51996f174f351
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.3"
jni_util:
... ... @@ -560,7 +560,7 @@ packages:
description:
name: jni_util
sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
json_annotation:
... ... @@ -568,7 +568,7 @@ packages:
description:
name: json_annotation
sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.12.0"
leak_tracker:
... ... @@ -576,7 +576,7 @@ packages:
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "11.0.2"
leak_tracker_flutter_testing:
... ... @@ -584,7 +584,7 @@ packages:
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.10"
leak_tracker_testing:
... ... @@ -592,7 +592,7 @@ packages:
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
lints:
... ... @@ -600,7 +600,7 @@ packages:
description:
name: lints
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.1.1"
logger:
... ... @@ -608,7 +608,7 @@ packages:
description:
name: logger
sha256: "2a0dc097e7b01d942475bdd552356db2d0f768b05540bd4b2b53f1840f2239a7"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.8.0"
logging:
... ... @@ -616,7 +616,7 @@ packages:
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
lottie:
... ... @@ -624,7 +624,7 @@ packages:
description:
name: lottie
sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.3.1"
matcher:
... ... @@ -632,7 +632,7 @@ packages:
description:
name: matcher
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.12.19"
material_color_utilities:
... ... @@ -640,7 +640,7 @@ packages:
description:
name: material_color_utilities
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.13.0"
meta:
... ... @@ -648,7 +648,7 @@ packages:
description:
name: meta
sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.19.0"
mime:
... ... @@ -656,7 +656,7 @@ packages:
description:
name: mime
sha256: bd47de35f07e27267e69c8c8b22edf9473bfee170a60d60fcc93730c5144b7f6
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
objective_c:
... ... @@ -664,7 +664,7 @@ packages:
description:
name: objective_c
sha256: ad56fd53a78ff6b1472fa59ff2a4e8b8ccabafc586fc263a1dfad0b99b5553e3
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "9.6.0"
octo_image:
... ... @@ -672,7 +672,7 @@ packages:
description:
name: octo_image
sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
package_config:
... ... @@ -680,7 +680,7 @@ packages:
description:
name: package_config
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
path:
... ... @@ -688,7 +688,7 @@ packages:
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path_provider:
... ... @@ -705,7 +705,7 @@ packages:
description:
name: path_provider_android
sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
path_provider_foundation:
... ... @@ -713,7 +713,7 @@ packages:
description:
name: path_provider_foundation
sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.6.0"
path_provider_linux:
... ... @@ -721,7 +721,7 @@ packages:
description:
name: path_provider_linux
sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
path_provider_ohos:
... ... @@ -738,7 +738,7 @@ packages:
description:
name: path_provider_platform_interface
sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
path_provider_windows:
... ... @@ -746,7 +746,7 @@ packages:
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.0"
permission_handler:
... ... @@ -754,7 +754,7 @@ packages:
description:
name: permission_handler
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "11.4.0"
permission_handler_android:
... ... @@ -762,7 +762,7 @@ packages:
description:
name: permission_handler_android
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "12.1.0"
permission_handler_apple:
... ... @@ -770,7 +770,7 @@ packages:
description:
name: permission_handler_apple
sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "9.6.1"
permission_handler_html:
... ... @@ -778,7 +778,7 @@ packages:
description:
name: permission_handler_html
sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.1.4+1"
permission_handler_ohos:
... ... @@ -795,7 +795,7 @@ packages:
description:
name: permission_handler_platform_interface
sha256: ed86a61c190258fdd65de395ea0632822e3415c1faec38eae0c31b479c28a531
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.4.1"
permission_handler_windows:
... ... @@ -803,7 +803,7 @@ packages:
description:
name: permission_handler_windows
sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
pigeon:
... ... @@ -820,7 +820,7 @@ packages:
description:
name: platform
sha256: a36d119c13416516a7b5913fbe8af8531e11633d784c550b2125f76c758524ec
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
plugin_platform_interface:
... ... @@ -828,7 +828,7 @@ packages:
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
pool:
... ... @@ -836,7 +836,7 @@ packages:
description:
name: pool
sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.5.3"
posix:
... ... @@ -844,7 +844,7 @@ packages:
description:
name: posix
sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "6.5.2"
pretty_dio_logger:
... ... @@ -852,7 +852,7 @@ packages:
description:
name: pretty_dio_logger
sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
pub_semver:
... ... @@ -860,7 +860,7 @@ packages:
description:
name: pub_semver
sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
pubspec_parse:
... ... @@ -868,7 +868,7 @@ packages:
description:
name: pubspec_parse
sha256: c38b81cbf34450b67e0265d73433569d12e34782e30ed769c9cc99c9d5f2e796
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.6.0"
record_use:
... ... @@ -876,7 +876,7 @@ packages:
description:
name: record_use
sha256: "1cb8564af8d43b464294411db9217f5ec04891c6f22ee2c32d73ae05e88a6bd2"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
rxdart:
... ... @@ -884,7 +884,7 @@ packages:
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.28.0"
share_plus:
... ... @@ -919,7 +919,7 @@ packages:
description:
name: shared_preferences_android
sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.23"
shared_preferences_foundation:
... ... @@ -927,7 +927,7 @@ packages:
description:
name: shared_preferences_foundation
sha256: "2ec3934efa51e46117f23031cc141b8fc878e8525b94ec1ea4f7f586cf1b47ea"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.5.7"
shared_preferences_linux:
... ... @@ -935,7 +935,7 @@ packages:
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_ohos:
... ... @@ -952,7 +952,7 @@ packages:
description:
name: shared_preferences_platform_interface
sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
shared_preferences_web:
... ... @@ -960,7 +960,7 @@ packages:
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
shared_preferences_windows:
... ... @@ -968,7 +968,7 @@ packages:
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shelf:
... ... @@ -976,7 +976,7 @@ packages:
description:
name: shelf
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.2"
shelf_web_socket:
... ... @@ -984,7 +984,7 @@ packages:
description:
name: shelf_web_socket
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
simple_gesture_detector:
... ... @@ -992,7 +992,7 @@ packages:
description:
name: simple_gesture_detector
sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
sky_engine:
... ... @@ -1005,7 +1005,7 @@ packages:
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.10.2"
sqflite:
... ... @@ -1022,7 +1022,7 @@ packages:
description:
name: sqflite_android
sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2+3"
sqflite_common:
... ... @@ -1030,7 +1030,7 @@ packages:
description:
name: sqflite_common
sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.5.8"
sqflite_darwin:
... ... @@ -1038,7 +1038,7 @@ packages:
description:
name: sqflite_darwin
sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
sqflite_ohos:
... ... @@ -1055,7 +1055,7 @@ packages:
description:
name: sqflite_platform_interface
sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
stack_trace:
... ... @@ -1063,7 +1063,7 @@ packages:
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
... ... @@ -1071,7 +1071,7 @@ packages:
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
stream_transform:
... ... @@ -1079,7 +1079,7 @@ packages:
description:
name: stream_transform
sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
string_scanner:
... ... @@ -1087,23 +1087,23 @@ packages:
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5"
url: "https://pub.flutter-io.cn"
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
url: "https://pub.dev"
source: hosted
version: "3.4.0+1"
version: "3.4.0"
table_calendar:
dependency: "direct main"
description:
name: table_calendar
sha256: f276347cad425ef837a41e8d9ad43f3ee7d59227aa4c36d7430607a5a18fa3b3
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
term_glyph:
... ... @@ -1111,7 +1111,7 @@ packages:
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
... ... @@ -1119,7 +1119,7 @@ packages:
description:
name: test_api
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.7.10"
thinking_analytics:
... ... @@ -1127,7 +1127,7 @@ packages:
description:
name: thinking_analytics
sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.3.3"
typed_data:
... ... @@ -1135,7 +1135,7 @@ packages:
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
url_launcher_linux:
... ... @@ -1143,7 +1143,7 @@ packages:
description:
name: url_launcher_linux
sha256: "10f86fef4c2c43563fa6c211ff9cf757adf4d3ab762c56bd430664a947d70cd0"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.2.3"
url_launcher_platform_interface:
... ... @@ -1151,7 +1151,7 @@ packages:
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
... ... @@ -1159,7 +1159,7 @@ packages:
description:
name: url_launcher_web
sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
url_launcher_windows:
... ... @@ -1167,7 +1167,7 @@ packages:
description:
name: url_launcher_windows
sha256: "6c5ad3f22cd4c38e089b81963b3cd7bb83b111b2df5dce008bb066162f42e429"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
uuid:
... ... @@ -1175,7 +1175,7 @@ packages:
description:
name: uuid
sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "4.6.0"
vector_math:
... ... @@ -1183,7 +1183,7 @@ packages:
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
video_thumbnail:
... ... @@ -1191,7 +1191,7 @@ packages:
description:
name: video_thumbnail
sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "0.5.6"
vm_service:
... ... @@ -1199,7 +1199,7 @@ packages:
description:
name: vm_service
sha256: "5f37239c4851efcef929cea7824e76df7f2f0970aef85d66bbc430afa40e72f0"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "15.3.0"
watcher:
... ... @@ -1207,7 +1207,7 @@ packages:
description:
name: watcher
sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
web:
... ... @@ -1215,7 +1215,7 @@ packages:
description:
name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
web_socket:
... ... @@ -1223,7 +1223,7 @@ packages:
description:
name: web_socket
sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
web_socket_channel:
... ... @@ -1231,7 +1231,7 @@ packages:
description:
name: web_socket_channel
sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
webview_flutter:
... ... @@ -1284,7 +1284,7 @@ packages:
description:
name: win32
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "5.15.0"
xdg_directories:
... ... @@ -1292,7 +1292,7 @@ packages:
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
yaml:
... ... @@ -1300,9 +1300,9 @@ packages:
description:
name: yaml
sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea
url: "https://pub.flutter-io.cn"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
sdks:
dart: ">=3.11.0 <4.0.0"
dart: ">=3.10.3 <4.0.0"
flutter: ">=3.38.4"
... ...