animated_list_controller.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import 'package:flutter/widgets.dart';
  2. class AnimatedListController<T> {
  3. final List<T> items = [];
  4. final GlobalKey<SliverAnimatedListState> listKey =
  5. GlobalKey<SliverAnimatedListState>();
  6. set items(List<T> items) {
  7. this.items = items;
  8. }
  9. void add(T item,
  10. {Duration duration = const Duration(milliseconds: 300), int? index}) {
  11. if (index != null) {
  12. items.insert(index, item);
  13. listKey.currentState?.insertItem(index, duration: duration);
  14. } else {
  15. items.add(item);
  16. listKey.currentState?.insertItem(items.length - 1, duration: duration);
  17. }
  18. }
  19. void addAtIndex(int index, List<T> newItems,
  20. {Duration duration = const Duration(milliseconds: 300)}) {
  21. for (var i = 0; i < newItems.length; i++) {
  22. items.insert(index + i, newItems[i]);
  23. listKey.currentState?.insertItem(index + i, duration: duration);
  24. }
  25. }
  26. void addAll(List<T> newItems,
  27. {Duration duration = const Duration(milliseconds: 300)}) {
  28. for (var i = 0; i < newItems.length; i++) {
  29. items.add(newItems[i]);
  30. listKey.currentState?.insertItem(items.length - 1, duration: duration);
  31. }
  32. }
  33. void update(int index, T item) {
  34. clearAt(index);
  35. add(item, index: index);
  36. }
  37. void removeItem(
  38. T item, Widget Function(BuildContext, Animation<double>, T) buildItem,
  39. {Duration duration = const Duration(milliseconds: 300)}) {
  40. final index = items.indexOf(item);
  41. if (index != -1) {
  42. items.removeAt(index);
  43. listKey.currentState?.removeItem(
  44. index,
  45. (context, animation) => buildItem(context, animation, item),
  46. duration: duration,
  47. );
  48. }
  49. }
  50. void remove(
  51. int index, Widget Function(BuildContext, Animation<double>, T) buildItem,
  52. {Duration duration = const Duration(milliseconds: 300)}) {
  53. final removedItem = items.removeAt(index);
  54. listKey.currentState?.removeItem(
  55. index,
  56. (context, animation) => buildItem(context, animation, removedItem),
  57. duration: duration,
  58. );
  59. }
  60. void removeAtIndex(int index, int count,
  61. Widget Function(BuildContext, Animation<double>, T) buildItem,
  62. {Duration duration = const Duration(milliseconds: 300)}) {
  63. for (var i = 0; i < count; i++) {
  64. final removedItem = items.removeAt(index);
  65. listKey.currentState?.removeItem(
  66. index,
  67. (context, animation) => buildItem(context, animation, removedItem),
  68. duration: duration,
  69. );
  70. }
  71. }
  72. void removeAll(Widget Function(BuildContext, Animation<double>, T) buildItem,
  73. {Duration duration = const Duration(milliseconds: 300)}) {
  74. for (var i = items.length - 1; i >= 0; i--) {
  75. final removedItem = items.removeAt(i);
  76. listKey.currentState?.removeItem(
  77. i,
  78. (context, animation) => buildItem(context, animation, removedItem),
  79. duration: duration,
  80. );
  81. }
  82. }
  83. /// *不带动画****
  84. void clearAt(int index) {
  85. items.removeAt(index);
  86. listKey.currentState
  87. ?.removeItem(index, (context, animation) => Container());
  88. }
  89. void clearAll() {
  90. items.clear();
  91. listKey.currentState?.removeAllItems((context, animation) => Container());
  92. }
  93. /// *不带动画****
  94. int get length {
  95. return items.length;
  96. }
  97. T get(int index) {
  98. return items[index];
  99. }
  100. int indexOf(T item) {
  101. return items.indexOf(item);
  102. }
  103. }