Files
plan_flutter/lib/page/plan/detail/plan_detail_page.dart
zhutao 193d29b0ce 1
2025-09-05 18:00:26 +08:00

149 lines
4.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:plan/page/plan/detail/viewmodel/plan_detail_store.dart';
import 'package:plan/theme/decorations/app_shadows.dart';
import 'package:plan/widgets/ui_kit/popup/popup_action.dart';
import 'package:provider/provider.dart';
import 'package:remixicon/remixicon.dart';
import '../widgets/edit_desc_dialog.dart';
import 'widgets/avatar_card.dart';
import 'widgets/coach_message.dart';
import 'widgets/plan_list.dart';
import 'widgets/scroll_box.dart';
import 'widgets/suggested.dart';
class PlanDetailPage extends StatefulWidget {
final String? id;
final String? planName;
const PlanDetailPage({
super.key,
this.id,
this.planName,
});
@override
State<PlanDetailPage> createState() => _PlanDetailPageState();
}
class _PlanDetailPageState extends State<PlanDetailPage> {
bool _isEdit = false;
final ScrollController scrollController = ScrollController();
///store对象
late PlanDetailStore store;
@override
void initState() {
super.initState();
store = PlanDetailStore(
planId: widget.id.toString(),
planContent: widget.planName ?? "",
scrollController: scrollController,
);
}
///popup菜单
void _onPopupActionSelected(String value) {
if (value == 'edit_step') {
setState(() {
_isEdit = true;
});
} else if (value == 'edit_desc') {
showEditDescDialog(
context,
value: "你好",
onConfirm: (value) {},
);
}
}
///取消编辑
void _cancelEdit() {
setState(() {
_isEdit = false;
});
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<PlanDetailStore>(
create: (_) {
return store;
},
child: Consumer<PlanDetailStore>(
child: SafeArea(
child: Column(
children: [
AvatarCard(),
Expanded(
child: Padding(
padding: EdgeInsets.all(15),
child: ScrollBox(
child: Container(
decoration: shadowDecoration,
child: CustomScrollView(
controller: scrollController,
slivers: [
CoachMessage(),
PlanList(),
SuggestedTitle(),
SuggestedList(),
],
),
),
),
),
),
],
),
),
builder: (context, store, child) {
return CupertinoPageScaffold(
backgroundColor: Colors.white,
navigationBar: CupertinoNavigationBar(
middle: Text(store.planDetail.summary ?? ""),
trailing: Row(
mainAxisSize: MainAxisSize.min, // 关键Row 只占实际内容宽度
children: [
AnimatedSwitcher(
duration: Duration(milliseconds: 300),
transitionBuilder: (child, animation) {
// 仅使用渐变动画
return FadeTransition(
opacity: animation,
child: child,
);
},
child: _isEdit
? InkWell(
onTap: _cancelEdit,
child: Icon(RemixIcons.check_fill),
)
: PopupAction(
onSelected: _onPopupActionSelected,
items: [
PopupMenuItem(
value: 'edit_step',
child: Text("编辑步骤"),
),
PopupMenuItem(
value: 'edit_desc',
child: Text("编辑摘要"),
),
],
child: Icon(RemixIcons.more_fill),
),
),
],
),
),
child: child!,
);
},
),
);
}
}