新增:宠物头像接线——铅笔角标接上传、列表与详情展示真实头像(T3.5-09)
- `Pet.avatarUrl` 入模型;列表卡与详情头像改用真实预签名 URL(无图仍回退 爪印占位——服务端对非 ready 的 asset 直接给 null,客户端只有一种占位)。 - 详情页铅笔角标自此有功能:接 `MediaUploader`(purpose=pet_avatar);已有 头像时先给「更换 / 移除」二选一,移除即三态显式 null。 - 权限按 **WRITE 档**呈现(ADR-022 D3.5-3:owner + caregiver 可改头像, viewer 无入口),与资料编辑的 MANAGE 档刻意不同。因此纯头像 PATCH 只发 `version` + `avatarAssetId`,**不夹带任何资料字段**——夹带会让服务端按更严 的一半定档,caregiver 立刻 403。 - `UpdatePetRequest.avatarAssetId` 是该 schema 唯一的三态字段,其余字段保持 M2 两态语义(它们的 CHECK 约束本就不允许空值,「清空」无意义)。 - 40902 冲突后重取档案让用户自行决定重来,不静默重放(头像是用户可见的 覆盖操作,不该自动生效两次)。 测试 588 → 597(+9)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:patbond_flutter/analytics/analytics_page_name.dart';
|
||||
import 'package:patbond_flutter/core/navigation/fade_route.dart';
|
||||
import 'package:patbond_flutter/core/theme/app_theme.dart';
|
||||
import 'package:patbond_flutter/core/widgets/avatar_upload_sheet.dart';
|
||||
import 'package:patbond_flutter/core/widgets/empty_state_illustration.dart';
|
||||
import 'package:patbond_flutter/core/widgets/inline_error_banner.dart';
|
||||
import 'package:patbond_flutter/core/widgets/pet_avatar.dart';
|
||||
@@ -25,6 +26,7 @@ class PetsPage extends StatefulWidget {
|
||||
super.key,
|
||||
this.analytics,
|
||||
this.healthAnalytics,
|
||||
this.avatarUploaderBuilder,
|
||||
});
|
||||
|
||||
final PetsController controller;
|
||||
@@ -33,6 +35,9 @@ class PetsPage extends StatefulWidget {
|
||||
/// health_record 域埋点(T2-13,记录页面族透传)。
|
||||
final HealthRecordAnalytics? healthAnalytics;
|
||||
|
||||
/// 头像上传编排器构造口(T3.5-09,透传详情页)。
|
||||
final AvatarUploaderBuilder? avatarUploaderBuilder;
|
||||
|
||||
@override
|
||||
State<PetsPage> createState() => _PetsPageState();
|
||||
}
|
||||
@@ -75,6 +80,7 @@ class _PetsPageState extends State<PetsPage> {
|
||||
petId: pet.id,
|
||||
analytics: widget.analytics,
|
||||
healthAnalytics: widget.healthAnalytics,
|
||||
avatarUploaderBuilder: widget.avatarUploaderBuilder,
|
||||
),
|
||||
settings: RouteSettings(name: AnalyticsPageName.petDetail.pageName),
|
||||
),
|
||||
@@ -189,7 +195,8 @@ class _PetCard extends StatelessWidget {
|
||||
padding: const EdgeInsets.all(14),
|
||||
child: Row(
|
||||
children: [
|
||||
const PetAvatar(size: PetAvatarSize.lg),
|
||||
// T3.5-09:列表卡展示真实头像(预签名 URL,无图回退爪印占位)。
|
||||
PetAvatar(size: PetAvatarSize.lg, url: pet.avatarUrl),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: Column(
|
||||
|
||||
Reference in New Issue
Block a user