import 'dart:convert'; import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'preview_tile.dart'; import 'api/api.dart'; import 'platform.dart'; class ShuffleScreen extends StatefulWidget { const ShuffleScreen({Key? key}) : super(key: key); @override State createState() => _ShuffleScreenState(); } class _ShuffleScreenState extends State { late Future> _data; Future> loadData(int nr) async { final data = await API.query("video", "getRandomMovies", {'Number': nr, 'Seed': Random().nextInt(0x7fffffff)}); final d = jsonDecode(data); List dta = (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList(); return dta; } @override void initState() { super.initState(); _data = Future.delayed(Duration.zero).then((_) { double width = MediaQuery.of(context).size.width; return loadData((isTV() ? width ~/ 200 : width ~/ 330) * 2); }); } @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return FutureBuilder>( future: _data, // a previously-obtained Future or null builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasError) { return Text("Error"); } else if (snapshot.hasData) { return Column(children: [ MasonryGridView.count( shrinkWrap: true, // every tile should be at max 330 pixels long... crossAxisCount: isTV() ? width ~/ 200 : width ~/ 330, mainAxisSpacing: 4, crossAxisSpacing: 4, padding: EdgeInsets.all(5), itemCount: snapshot.data!.length, itemBuilder: (context, index) { return PreviewTile(dta: snapshot.data![index]); }, ), const SizedBox( height: 25, ), TextButton.icon( onPressed: () { setState(() { _data = loadData((isTV() ? width ~/ 200 : width ~/ 330) * 2); }); }, icon: const Icon(Icons.update), label: const Text("Shuffle")) ]); } else { return Column(children: const [ SizedBox( width: 60, height: 60, child: CircularProgressIndicator(), ), Padding( padding: EdgeInsets.only(top: 16), child: Text('Awaiting result...'), ) ]); } }, ); } }