Files
plan_flutter/lib/widgets/business/delete_row_item.dart
zhutao 0231dcfe1a 1
2025-09-04 17:57:35 +08:00

114 lines
2.7 KiB
Dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:remixicon/remixicon.dart';
class DeleteRowItem extends StatefulWidget {
final bool showDelete;
final List<Widget> Function(BuildContext context, Animation<double> animation) builder;
final Function() onDelete;
const DeleteRowItem({
super.key,
this.showDelete = false,
required this.builder,
required this.onDelete,
});
@override
State<DeleteRowItem> createState() => _DeleteRowItemState();
}
class _DeleteRowItemState extends State<DeleteRowItem> with TickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(milliseconds: 300),
);
_animation = CurvedAnimation(
parent: _controller,
curve: Curves.easeInOut,
);
if (widget.showDelete) {
_controller.forward();
}
}
@override
void didUpdateWidget(covariant DeleteRowItem oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.showDelete != widget.showDelete) {
if (widget.showDelete) {
_controller.forward();
} else {
_controller.reverse();
}
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
///点击删除
void _handleDelete() {
showCupertinoDialog(
context: context,
builder: (_) {
return CupertinoAlertDialog(
title: Text("删除计划"),
actions: [
CupertinoDialogAction(
child: Text("取消"),
onPressed: () {
context.pop();
},
),
CupertinoDialogAction(
isDestructiveAction: true,
onPressed: () {
context.pop();
widget.onDelete();
},
child: Text("确定"),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Row(
children: [
SizeTransition(
axis: Axis.horizontal,
sizeFactor: _animation,
axisAlignment: -1, // 从左向右展开
child: InkWell(
onTap: _handleDelete,
child: Container(
margin: EdgeInsets.only(right: 10),
child: Icon(
RemixIcons.indeterminate_circle_fill,
color: Colors.red,
),
),
),
),
...widget.builder(context, _animation),
// ...widget.children,
],
);
}
}