OpenMediacenterMobileFlutter/lib/video_screen/info_view.dart

85 lines
2.5 KiB
Dart
Raw Normal View History

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:openmediacentermobile/screen_loading.dart';
import 'package:openmediacentermobile/preview/tag_tile.dart';
import 'package:openmediacentermobile/types/video_data.dart';
import 'package:openmediacentermobile/preview/actor_tile.dart';
import '../api/api.dart';
import '../types/actor.dart';
class InfoView extends StatefulWidget {
const InfoView({Key? key, required this.vdata}) : super(key: key);
final VideoData vdata;
@override
State<InfoView> createState() => _InfoViewState();
}
class _InfoViewState extends State<InfoView> {
late Future<List<Actor>> _data;
@override
void initState() {
setState(() {
_data = loadData();
});
super.initState();
}
Future<List<Actor>> loadData() async {
final data = await API
.query("actor", "getActorsOfVideo", {'MovieId': widget.vdata.movieId});
if (data == 'null') {
return [];
}
final d = jsonDecode(data);
List<Actor> dta = (d as List).map((e) => Actor.fromJson(e)).toList();
return dta;
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _data,
builder: (context, AsyncSnapshot<List<Actor>> snapshot) {
if (snapshot.hasError) {
return Text("Error");
} else if (snapshot.hasData) {
final actors = snapshot.data;
return Padding(
padding: EdgeInsets.only(left: 10, right: 10, top: 30),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Likes: ${widget.vdata.likes}"),
Text("Quality: ${widget.vdata.quality}"),
Text("Length: ${widget.vdata.length}sec"),
Text("Actors:"),
actors?.isEmpty ?? true
? Text("no actors available")
: Row(
children: _renderActors(snapshot.data!),
),
Text("Tags:"),
Row(
children: widget.vdata.tags
.map((e) => TagTile(tag: e))
.toList(growable: false),
)
]));
} else {
return ScreenLoading();
}
},
);
}
List<Widget> _renderActors(List<Actor> actors) {
return actors.map((e) => ActorTile(actor: e)).toList(growable: false);
}
}