import 'package:flutter/material.dart'; import '../core/theme/app_theme.dart'; class DataTableCard extends StatelessWidget { final List columns; final List rows; final Widget? toolbar; final int? totalCount; final int page; final int pageSize; final ValueChanged? onPageChanged; const DataTableCard({ super.key, required this.columns, required this.rows, this.toolbar, this.totalCount, this.page = 1, this.pageSize = 20, this.onPageChanged, }); @override Widget build(BuildContext context) { return Column( children: [ if (toolbar != null) Container( color: AppTheme.surface, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), child: toolbar!, ), if (toolbar != null) const Divider(height: 1), Expanded( child: LayoutBuilder( builder: (context, constraints) => SingleChildScrollView( child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: ConstrainedBox( constraints: BoxConstraints(minWidth: constraints.maxWidth), child: DataTable( headingRowColor: WidgetStateProperty.all( const Color(0xFFF0F4FF)), headingTextStyle: const TextStyle( fontSize: 13, fontWeight: FontWeight.w600, color: AppTheme.primaryDark, ), dataTextStyle: const TextStyle( fontSize: 13, color: AppTheme.textPrimary), columnSpacing: 24, horizontalMargin: 16, dataRowMinHeight: 40, dataRowMaxHeight: 56, dividerThickness: 0.5, columns: columns, rows: rows, ), ), ), ), ), ), // Pagination if (totalCount != null) Container( height: 48, color: AppTheme.surface, padding: const EdgeInsets.symmetric(horizontal: 16), child: Row( children: [ Text( '共 $totalCount 条记录', style: const TextStyle( fontSize: 13, color: AppTheme.textSecondary), ), const Spacer(), _PaginationBar( page: page, total: totalCount!, pageSize: pageSize, onPageChanged: onPageChanged, ), ], ), ), ], ); } } class _PaginationBar extends StatelessWidget { final int page; final int total; final int pageSize; final ValueChanged? onPageChanged; const _PaginationBar({ required this.page, required this.total, required this.pageSize, this.onPageChanged, }); @override Widget build(BuildContext context) { final totalPages = (total / pageSize).ceil().clamp(1, 9999); return Row( children: [ IconButton( icon: const Icon(Icons.first_page, size: 18), onPressed: page > 1 ? () => onPageChanged?.call(1) : null, padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 28, minHeight: 28), ), IconButton( icon: const Icon(Icons.chevron_left, size: 18), onPressed: page > 1 ? () => onPageChanged?.call(page - 1) : null, padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 28, minHeight: 28), ), Text('$page / $totalPages', style: const TextStyle(fontSize: 13)), IconButton( icon: const Icon(Icons.chevron_right, size: 18), onPressed: page < totalPages ? () => onPageChanged?.call(page + 1) : null, padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 28, minHeight: 28), ), IconButton( icon: const Icon(Icons.last_page, size: 18), onPressed: page < totalPages ? () => onPageChanged?.call(totalPages) : null, padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 28, minHeight: 28), ), ], ); } }