Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 使用StreamBuilder重新绘制边界_Flutter_Rendering_Paint_Stream Builder - Fatal编程技术网

Flutter 使用StreamBuilder重新绘制边界

Flutter 使用StreamBuilder重新绘制边界,flutter,rendering,paint,stream-builder,Flutter,Rendering,Paint,Stream Builder,我以为我明白了,但现在我不明白 背景 我写了一篇文章,描述了如何在一个小部件周围添加一个repainboundary,这个小部件必须画很多图,以防止小部件树的其他部分被重画。这是意料之中的事 现在的问题 我现在尝试制作一个真实的示例,其中小部件在基于音频播放器流的StreamBuilder中重建。我尝试将整个StreamBuilder包装在repainboundary中,如下所示: @覆盖 小部件构建(构建上下文){ 打印(“建筑应用程序”); 返回脚手架( 正文:专栏( 儿童:[ 垫片(),

我以为我明白了,但现在我不明白

背景 我写了一篇文章,描述了如何在一个小部件周围添加一个
repainboundary
,这个小部件必须画很多图,以防止小部件树的其他部分被重画。这是意料之中的事

现在的问题 我现在尝试制作一个真实的示例,其中小部件在基于音频播放器流的
StreamBuilder
中重建。我尝试将整个
StreamBuilder
包装在
repainboundary
中,如下所示:

@覆盖
小部件构建(构建上下文){
打印(“建筑应用程序”);
返回脚手架(
正文:专栏(
儿童:[
垫片(),
重新绘制边界(
孩子:ProgressBarWidget(
持续状态:_持续状态,玩家:_玩家),
),
重新绘制边界(
孩子:PlaybauseButton(玩家:_玩家),
),
],
),
);
}
但UI的其余部分仍在重新绘制(除了播放/暂停按钮,我还将其包装在了
重新绘制边界中)

ProgressBarWidget的构建方法如下所示:

@覆盖
小部件构建(构建上下文){
打印(“建筑进度条”);
返回流生成器(
流:_durationState,
生成器:(上下文,快照){
最终持续时间状态=snapshot.data;
最终进度=持续状态?.progress??持续时间.0;
最终缓冲=持续状态?缓冲??持续时间.0;
最终总计=持续状态?总计?持续时间.0;
返回进度条(
进展:进展,
缓冲的:缓冲的,
总计:总计,
星期一:(持续时间){
_player.seek(持续时间);
},
);
},
);
}
但是如果我像这样删除
StreamBuilder

@覆盖
小部件构建(构建上下文){
打印(“建筑进度条”);
返回进度条(
进度:Duration.zero,
总计:持续时间(分钟:5),
星期一:(持续时间){
_player.seek(持续时间);
},
);
}
然后,当我手动移动拇指时,重新绘制边界再次工作

StreamBuilder
的什么原因使得
repaitbundary
无法工作

完整代码 小部件布局的完整代码如下:

导入“包装:颤振/材料.省道”;
导入“package:audio_video_progress_bar/audio_video_progress_bar.dart”;
导入“package:flatter/rendering.dart”;
导入“包:just_audio/just_audio.dart”;
导入“包:rxdart/rxdart.dart”;
void main(){
debugRepaintTextRainbowEnabled=true;
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:主题数据(
原色样本:颜色。深紫色,
),
主页:HomeWidget(),
);
}
}
类HomeWidget扩展了StatefulWidget{
@凌驾
_HomeWidgetState createState();
}
类_HomeWidgetState扩展状态{
音频播放器;
最终url=https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3';
流持续状态;
@凌驾
void initState(){
super.initState();
_播放器=音频播放器();
_持续时间状态=Rx.CombineRelatest2(
_player.stream,
_player.playbackEventStream,
(位置,回放事件)=>DurationState(
进展:立场,
缓冲:playbackEvent.bufferedPosition,
总计:playbackEvent.duration,
));
_init();
}
Future _init()异步{
试一试{
wait_player.setUrl(url);
}捕获(e){
打印(“发生错误$e”);
}
}
@凌驾
小部件构建(构建上下文){
打印(“建筑应用程序”);
返回脚手架(
正文:专栏(
儿童:[
垫片(),
重新绘制边界(
孩子:ProgressBarWidget(
持续状态:_持续状态,玩家:_玩家),
),
重新绘制边界(
孩子:PlaybauseButton(玩家:_玩家),
),
],
),
);
}
}
类ProgressBarWidget扩展了无状态Widget{
constprogressbarwidget({
关键点,
@所需的流持续时间状态,
@必需的音频播放器,
}):_durationState=durationState,
_玩家,
超级(键:键);
最终流持续状态;
最终音频播放器(U播放器),;
@凌驾
小部件构建(构建上下文){
打印(“建筑进度条”);
返回流生成器(
流:_durationState,
生成器:(上下文,快照){
最终持续时间状态=snapshot.data;
最终进度=持续状态?.progress??持续时间.0;
最终缓冲=持续状态?缓冲??持续时间.0;
最终总计=持续状态?总计?持续时间.0;
返回进度条(
进展:进展,
缓冲的:缓冲的,
总计:总计,
星期一:(持续时间){
_player.seek(持续时间);
},
);
},
);
//进度条(
//进度:Duration.zero,
//总计:持续时间(分钟:5),
//星期一:(持续时间){
//_player.seek(持续时间);
//   },
// );
}
}
类PlayPauseButton扩展了无状态小部件{
康斯特播放按钮({
关键点,
@必需的音频播放器,
}):_player=player,
超级(键:键);
最终音频播放器(U播放器),;
@凌驾
小部件构建(构建上下文){
打印(“建筑物播放/暂停按钮”);
返回流生成器(
流:_player.playerStateStream,
生成器:(上下文,快照){
最终播放状态=snapshot.data;
最终处理状态=播放状态?处理状态;
最终播放=播放状态?播放;
如果(processingState==processingState.loading||
processingState==processingState.buffering){
返回容器(