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/plan_item.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 createState() => _PlanDetailPageState(); } class _PlanDetailPageState extends State { bool _isEdit = false; ///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( create: (_) { return PlanDetailStore(); }, child: CupertinoPageScaffold( backgroundColor: Colors.white, navigationBar: CupertinoNavigationBar( middle: Text('计划详情'), 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: SafeArea( child: Column( children: [ AvatarCard(), Expanded( child: Padding( padding: EdgeInsets.all(15), child: ScrollBox( child: Container( decoration: shadowDecoration, child: CustomScrollView( slivers: [ SliverToBoxAdapter( child: SizedBox(height: 20), ), SliverList.builder( itemBuilder: (BuildContext context, int index) { return PlanItem( showEdit: _isEdit, title: "测试 ${index + 1}", desc: "测测 ${index + 1}", onDelete: (id) {}, ); }, itemCount: 10, ), SliverToBoxAdapter( child: SuggestedTitle(), ), SliverList.builder( itemBuilder: (BuildContext context, int index) { return SuggestedItem( title: "测试", ); }, itemCount: 5, ), ], ), ), ), ), ), ], ), ), ), ); } }