add pagination to activities

This commit is contained in:
Simon Ding
2024-07-21 11:34:38 +08:00
parent 2fd1c58acb
commit cee5debe1c
2 changed files with 67 additions and 47 deletions

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:percent_indicator/circular_percent_indicator.dart'; import 'package:percent_indicator/circular_percent_indicator.dart';
import 'package:ui/providers/activity.dart'; import 'package:ui/providers/activity.dart';
import 'package:ui/utils.dart';
import 'package:ui/widgets/progress_indicator.dart'; import 'package:ui/widgets/progress_indicator.dart';
class ActivityPage extends ConsumerWidget { class ActivityPage extends ConsumerWidget {
@@ -15,7 +16,8 @@ class ActivityPage extends ConsumerWidget {
return activitiesWatcher.when( return activitiesWatcher.when(
data: (activities) { data: (activities) {
return SingleChildScrollView( return SingleChildScrollView(
child: DataTable( child: PaginatedDataTable(
rowsPerPage: 10,
columns: const [ columns: const [
DataColumn(label: Text("#"), numeric: true), DataColumn(label: Text("#"), numeric: true),
DataColumn(label: Text("名称")), DataColumn(label: Text("名称")),
@@ -23,9 +25,36 @@ class ActivityPage extends ConsumerWidget {
DataColumn(label: Text("状态")), DataColumn(label: Text("状态")),
DataColumn(label: Text("操作")) DataColumn(label: Text("操作"))
], ],
rows: List<DataRow>.generate(activities.length, (i) { source: ActivityDataSource(activities: activities, onDelete: onDelete(ref)),
var activity = activities[activities.length - i - 1]; ),
);
},
error: (err, trace) => Text("$err"),
loading: () => const MyProgressIndicator());
}
Function(int) onDelete(WidgetRef ref) {
return (id) {
ref
.read(activitiesDataProvider.notifier)
.deleteActivity(id)
.whenComplete(() => Utils.showSnakeBar("删除成功"))
.onError((error, trace) => Utils.showSnakeBar("删除失败:$error"));
};
}
}
class ActivityDataSource extends DataTableSource {
List<Activity> activities;
Function(int) onDelete;
ActivityDataSource({required this.activities, required this.onDelete});
@override
int get rowCount => activities.length;
@override
DataRow? getRow(int index) {
final activity = activities[index];
return DataRow(cells: [ return DataRow(cells: [
DataCell(Text("${activity.id}")), DataCell(Text("${activity.id}")),
DataCell(Text("${activity.sourceTitle}")), DataCell(Text("${activity.sourceTitle}")),
@@ -33,9 +62,7 @@ class ActivityPage extends ConsumerWidget {
DataCell(() { DataCell(() {
if (activity.status == "uploading") { if (activity.status == "uploading") {
return const SizedBox( return const SizedBox(
width: 20, width: 20, height: 20, child: CircularProgressIndicator());
height: 20,
child: CircularProgressIndicator());
} else if (activity.status == "fail") { } else if (activity.status == "fail") {
return const Icon( return const Icon(
Icons.close, Icons.close,
@@ -48,9 +75,8 @@ class ActivityPage extends ConsumerWidget {
); );
} }
double p = activity.progress == null double p =
? 0 activity.progress == null ? 0 : activity.progress!.toDouble() / 100;
: activity.progress!.toDouble() / 100;
return CircularPercentIndicator( return CircularPercentIndicator(
radius: 15.0, radius: 15.0,
lineWidth: 5.0, lineWidth: 5.0,
@@ -59,19 +85,13 @@ class ActivityPage extends ConsumerWidget {
progressColor: Colors.green, progressColor: Colors.green,
); );
}()), }()),
DataCell(IconButton( DataCell(IconButton(onPressed:() => onDelete(activity.id!), icon: const Icon(Icons.delete)))
onPressed: () {
ref
.read(activitiesDataProvider.notifier)
.deleteActivity(activity.id!);
},
icon: const Icon(Icons.delete)))
]); ]);
}),
),
);
},
error: (err, trace) => Text("$err"),
loading: () => const MyProgressIndicator());
} }
@override
bool get isRowCountApproximate => false;
@override
int get selectedRowCount => 0;
} }

View File

@@ -10,7 +10,7 @@ import 'package:ui/welcome_page.dart';
import 'package:ui/widgets/progress_indicator.dart'; import 'package:ui/widgets/progress_indicator.dart';
class MovieDetailsPage extends ConsumerStatefulWidget { class MovieDetailsPage extends ConsumerStatefulWidget {
static const route = "/movie/"; static const route = "/movie/:id";
static String toRoute(int id) { static String toRoute(int id) {
return "/movie/$id"; return "/movie/$id";