import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:pixes/components/illust_widget.dart'; import 'package:pixes/components/loading.dart'; import 'package:pixes/components/title_bar.dart'; import 'package:pixes/foundation/app.dart'; import 'package:pixes/network/network.dart'; import 'package:pixes/utils/translation.dart'; class RelatedIllustsPage extends StatefulWidget { const RelatedIllustsPage(this.id, {super.key}); final String id; @override State createState() => _RelatedIllustsPageState(); } class _RelatedIllustsPageState extends MultiPageLoadingState { @override Widget? buildFrame(BuildContext context, Widget child) { return Column( children: [ TitleBar(title: "Related artworks".tl), Expanded( child: child, ) ], ); } @override Widget buildContent(BuildContext context, final List data) { return LayoutBuilder(builder: (context, constrains) { return MasonryGridView.builder( padding: const EdgeInsets.symmetric(horizontal: 8) + EdgeInsets.only(bottom: context.padding.bottom), gridDelegate: const SliverSimpleGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 240, ), itemCount: data.length, itemBuilder: (context, index) { if (index == data.length - 1) { nextPage(); } return IllustWidget(data[index]); }, ); }); } String? nextUrl; @override Future>> loadData(page) async { if (nextUrl == "end") { return Res.error("No more data"); } var res = nextUrl == null ? await Network().relatedIllusts(widget.id) : await Network().getIllustsWithNextUrl(nextUrl!); if (!res.error) { nextUrl = res.subData; nextUrl ??= "end"; } return res; } }