如何解决如何从父小部件访问 videoController
所以我的 childWidget(VideoCard)中有一个 videoController。 父小部件具有 pageview.builder 和 childwidget 显示视频,(视频提要列表)。 我需要暂停小部件以每滑动 4 页显示插页式广告。 现在,如果我显示 adview,后台的视频仍在播放。 这是父小部件代码
StreamBuilder<ApiResponse<List<VideoData>>>(
stream: feedVideoBloc.videosResponseStream,builder: (context,snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: SpinKitThreeBounce(
color: Colors.pinkAccent,size: 30,),);
} else if (snapshot.data!.data!.isEmpty) {
return Center(
child: Text('No Videos'),);
} else {
return Stack(
children: [
Container(
color: Colors.black,child: PreloadPageView.builder(
itemCount: snapshot.data?.data?.length,onPageChanged: (index) {
userSwiped++;
if (userSwiped == 4) {
userSwiped = 0;
_showInterstitialAdSwipe();
}
feedPageIndex = index;
print(feedPageIndex);
if (index == snapshot.data!.data!.length - 2) {
feedVideoBloc.getAllVideos();
}
},pageSnapping: true,controller: pageViewVideoController,physics: BouncingScrollPhysics(),scrollDirection: Axis.vertical,preloadPagesCount: 1,itemBuilder: (BuildContext context,int index) {
if (snapshot.connectionState ==
ConnectionState.waiting) {
return CircularProgressIndicator();
}
if (snapshot.data!.status == Status.LOADING) {}
if (snapshot.data!.status == Status.HAS_DATA) {
return VideoCard(
followUser: (bool current) {
feedVideoBloc.followUser(
snapshot.data!.data![index].user!.id!,userModel.token!,current,index);
},likeVideo: (bool current) {
feedVideoBloc.postVideoLike(
snapshot.data!.data![index].id!,callback: (String url) {
_showInterstitialAdDownload(index,url);
},key: Key("unique key $index"),index: index,videoData: snapshot.data!.data![index],);
}
return CircularProgressIndicator();
},Visibility(
visible: snapshot.data!.showPaginationLoader &&
feedPageIndex == snapshot.data!.data!.length - 1,child: Center(
child: SpinKitThreeBounce(
color: Colors.pinkAccent,)),],);
}
}),
这是内部视频卡小部件
@override
void initState() {
super.initState();
_videoController = VideoPlayerController.network(widget.videoData.url!);
_videoController.setLooping(true);
_initializeVideoPlayerFuture =
_videoController.initialize().then((value) => setState(() {}));
}
AspectRatio(
aspectRatio: _videoController.value.aspectRatio,child: FittedBox(
fit: BoxFit.contain,child: SizedBox(
width: _videoController.value.size.width,height: _videoController.value.size.height,child: FutureBuilder<void>(
future: _initializeVideoPlayerFuture,snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return VisibilityDetector(
onVisibilityChanged: (VisibilityInfo info) {
debugPrint(
"${info.visibleFraction} of my widget is visible");
if (info.visibleFraction == 0) {
_videoController.pause();
} else {
playVideo();
}
},key: widget.key,child: VideoPlayer(_videoController),);
} else
return Center(
child: SpinKitThreeBounce(
color: Colors.pinkAccent,);
}),
解决方法
你仍然没有显示你在哪里声明了视频控制器变量,虽然我想我知道如何解决它,
只需在页面开头声明变量即可:
在您导入后立即
像这样:
//all imports
import 'flutter/material.dart';
var _videoController;
这样您就不会将控制器的使用限制在一个小部件上
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。