list_footer.dart 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import 'package:flutter/material.dart';
  2. import 'package:tdesign_flutter/tdesign_flutter.dart';
  3. import '../../core/i18n/app_localizations.dart';
  4. /// 列表底部「没有更多了」提示,仅在列表有数据且已全部加载完成时显示。
  5. ///
  6. /// ## 用法
  7. ///
  8. /// 放在 [ListView.builder] 末尾,作为最后一项:
  9. ///
  10. /// ```dart
  11. /// ListView.builder(
  12. /// itemCount: items.length + 1, // +1 给 footer 留位置
  13. /// itemBuilder: (_, i) {
  14. /// if (i == items.length) {
  15. /// return ListFooter(
  16. /// itemCount: items.length,
  17. /// hasMore: page < totalPages, // 分页时传真实状态
  18. /// );
  19. /// }
  20. /// return _buildItem(items[i]);
  21. /// },
  22. /// );
  23. /// ```
  24. ///
  25. /// ## 显示逻辑
  26. ///
  27. /// | itemCount | hasMore | 结果 |
  28. /// |-----------|---------|------|
  29. /// | > 0 | false | 显示「没有更多了」 |
  30. /// | > 0 | true | 不显示(还有下一页) |
  31. /// | 0 | 任意 | 不显示(空列表) |
  32. class ListFooter extends StatelessWidget {
  33. /// 当前列表中的项数。用于判断列表是否为空。
  34. final int itemCount;
  35. /// 是否还有更多数据待加载。
  36. ///
  37. /// 默认 `false`(全量数据已加载完成)。分页场景下传入 `true` 可避免过早显示。
  38. final bool hasMore;
  39. const ListFooter({super.key, required this.itemCount, this.hasMore = false});
  40. @override
  41. Widget build(BuildContext context) {
  42. // 仅在「有数据」且「无更多」时显示
  43. if (itemCount == 0 || hasMore) return const SizedBox.shrink();
  44. final l10n = AppLocalizations.of(context);
  45. return Padding(
  46. padding: const EdgeInsets.symmetric(vertical: 20),
  47. child: Row(
  48. mainAxisAlignment: MainAxisAlignment.center,
  49. children: [
  50. Icon(
  51. TDIcons.component_divider_horizontal,
  52. size: 14,
  53. color: TDTheme.of(context).textColorPlaceholder,
  54. ),
  55. const SizedBox(width: 6),
  56. Text(
  57. l10n.get('noMoreData'),
  58. style: TextStyle(
  59. fontSize: 12,
  60. color: TDTheme.of(context).textColorPlaceholder,
  61. ),
  62. ),
  63. ],
  64. ),
  65. );
  66. }
  67. }