import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:openmediacentermobile/api/api.dart'; import 'log/log.dart'; import 'platform.dart'; import 'preview_tile.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; class VideoFeed extends StatefulWidget { const VideoFeed({Key? key}) : super(key: key); @override State createState() { return VideoFeedState(); } } class VideoFeedState extends State { late Future> _data; Future> loadData() async { final data = await API.query("video", "getMovies", {'Tag': 1, 'Sort': 0}); final d = jsonDecode(data); List dta = (d['Videos'] as List).map((e) => VideoT.fromJson(e)).toList(); return dta; } @override void initState() { super.initState(); _data = loadData(); } @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; Log.d(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 MasonryGridView.count( // every tile should be at max 330 pixels long... crossAxisCount: isTV() ? width ~/ 200 : width ~/ 330, mainAxisSpacing: 4, crossAxisSpacing: 4, itemBuilder: (context, index) { return PreviewTile(dta: snapshot.data![index]); }, ); } else { return Column(children: const [ SizedBox( width: 60, height: 60, child: CircularProgressIndicator(), ), Padding( padding: EdgeInsets.only(top: 16), child: Text('Awaiting result...'), ) ]); } }, ); } }