MiniController thumbnail and play button

This commit is contained in:
gianlucaparadise 2022-01-13 19:35:25 +01:00
parent 54153126bd
commit b5a22b9599
4 changed files with 158 additions and 40 deletions

View file

@ -175,7 +175,9 @@ class _MyAppState extends State<MyApp> {
_buildTitle("Mini Controller"), _buildTitle("Mini Controller"),
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0), padding: const EdgeInsets.symmetric(vertical: 8.0),
child: MiniController(), child: MiniController(
castFramework: castFramework,
),
), ),
], ],
), ),

View file

@ -1,45 +1,43 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_cast_framework/src/cast/widgets/mini_controller/TransparentImage.dart';
import '../../../../cast.dart';
import 'MiniControllerThumbnail.dart';
import 'MiniControllerPlayPauseButton.dart';
class MiniController extends StatelessWidget { class MiniController extends StatelessWidget {
const MiniController({Key? key}) : super(key: key); final FlutterCastFramework castFramework;
void _onPausePressed() {} const MiniController({
Key? key,
required this.castFramework,
}) : super(key: key);
@override Widget _getControls(MediaStatus? status) {
Widget build(BuildContext context) { final thumbnail = MiniControllerThumbnail(mediaInfo: status?.mediaInfo);
final thumbnail = AspectRatio(
aspectRatio: 1,
child: FadeInImage.memoryNetwork(
fit: BoxFit.cover,
placeholder: kTransparentImage,
image:
"https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/images/480x270/BigBuckBunny.jpg",
),
);
// final titleText = mediaInfo?.mediaMetadata?.strings[MediaMetadataKey.title]
// final subtitleText = mediaInfo?.mediaMetadata?.strings[MediaMetadataKey.subtitle]
final titleText = "";
final subtitleText = "";
final title = Text( final title = Text(
"this.title", titleText,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle(fontWeight: FontWeight.w500), style: TextStyle(fontWeight: FontWeight.w500),
); );
final subtitle = Text( final subtitle = Text(
"this.subtitle", subtitleText,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle(color: Colors.grey), style: TextStyle(color: Colors.grey),
); );
final playPauseButton = IconButton( final playPauseButton = MiniControllerPlayPauseButton(
padding: EdgeInsets.zero, castFramework: castFramework,
onPressed: _onPausePressed, status: status,
icon: Icon(Icons.pause, color: Colors.black, size: 38),
); );
return Stack( return SizedBox(
children: [
SizedBox(
height: 60, height: 60,
child: Row( child: Row(
children: [ children: [
@ -58,6 +56,27 @@ class MiniController extends StatelessWidget {
playPauseButton, playPauseButton,
], ],
), ),
);
}
@override
Widget build(BuildContext context) {
var remoteMediaClient =
this.castFramework.castContext.sessionManager.remoteMediaClient;
return Stack(
children: [
StreamBuilder<MediaStatus>(
stream: remoteMediaClient.mediaStatusStream,
builder: (BuildContext context, AsyncSnapshot<MediaStatus> snapshot) {
if (snapshot.hasData && snapshot.data != null) {
return _getControls(snapshot.data);
} else if (snapshot.hasError) {
return _getControls(null);
} else {
return _getControls(null);
}
},
), ),
LinearProgressIndicator( LinearProgressIndicator(
color: Colors.red, color: Colors.red,

View file

@ -0,0 +1,62 @@
import 'package:flutter/material.dart';
import '../../../../cast.dart';
class MiniControllerPlayPauseButton extends StatelessWidget {
final FlutterCastFramework castFramework;
final MediaStatus? status;
const MiniControllerPlayPauseButton({
Key? key,
required this.castFramework,
this.status,
}) : super(key: key);
void _onPausePressed() {
var remoteMediaClient =
this.castFramework.castContext.sessionManager.remoteMediaClient;
remoteMediaClient.pause();
}
void _onPlayPressed() {
var remoteMediaClient =
this.castFramework.castContext.sessionManager.remoteMediaClient;
remoteMediaClient.play();
}
@override
Widget build(BuildContext context) {
switch (status?.playerState) {
case PlayerState.playing:
case PlayerState.buffering:
return IconButton(
padding: EdgeInsets.zero,
onPressed: _onPausePressed,
icon: Icon(Icons.pause, color: Colors.black, size: 38),
);
case PlayerState.paused:
return IconButton(
padding: EdgeInsets.zero,
onPressed: _onPlayPressed,
icon: Icon(Icons.play_arrow, color: Colors.black, size: 38),
);
case PlayerState.loading:
return Padding(
padding: const EdgeInsets.all(8.0),
child: CircularProgressIndicator(),
);
default:
// return disabled button
return IconButton(
padding: EdgeInsets.zero,
onPressed: null,
icon: Icon(Icons.play_arrow, color: Colors.grey, size: 38),
);
}
}
}

View file

@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
import '../../../../cast.dart';
import 'TransparentImage.dart';
class MiniControllerThumbnail extends StatelessWidget {
final MediaInfo? mediaInfo;
const MiniControllerThumbnail({
Key? key,
this.mediaInfo,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final webImages = mediaInfo?.mediaMetadata?.webImages;
if (webImages?.isEmpty == true) {
return SizedBox.shrink();
}
final imgUrl = webImages?.first?.url;
if (imgUrl == null || imgUrl.isEmpty) {
return SizedBox.shrink();
}
return AspectRatio(
aspectRatio: 1,
child: FadeInImage.memoryNetwork(
fit: BoxFit.cover,
placeholder: kTransparentImage,
image: imgUrl,
),
);
}
}