Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 AnimatedList中的滑块具有错误的值_Flutter_Flutter Animatedlist_Flutter Slider - Fatal编程技术网

Flutter AnimatedList中的滑块具有错误的值

Flutter AnimatedList中的滑块具有错误的值,flutter,flutter-animatedlist,flutter-slider,Flutter,Flutter Animatedlist,Flutter Slider,我有一个聊天泡泡小部件,它支持带有滑块的音频播放器。 滑块的值将根据音频播放器的进度进行更改,该进度似乎工作正常 当第一个音频完全播放时(意味着滑块的值现在为100%),&现在第二个聊天泡泡被添加到AnimatedList中,那么最新的滑块的值为100,前一个滑块的值为0 下面是一个更好理解的示例: 消息1添加到列表:音频播放完成=>滑块值为100。 消息2已添加到列表:滑块值为100(应为0)&消息1中的滑块值为0 以下是小部件: import'包:audioplayers/audioplay

我有一个聊天泡泡小部件,它支持带有
滑块的音频播放器。
滑块的值将根据音频播放器的进度进行更改,该进度似乎工作正常

当第一个音频完全播放时(意味着滑块的值现在为100%),&现在第二个聊天泡泡被添加到
AnimatedList
中,那么最新的滑块的值为100,前一个滑块的值为0

下面是一个更好理解的示例:
消息1添加到列表:音频播放完成=>滑块值为100。
消息2已添加到列表:滑块值为100(应为0)&消息1中的滑块值为0

以下是小部件:

import'包:audioplayers/audioplayers.dart';
进口“包装:颤振/材料.省道”;
类MessageBubbleAudioPlayer扩展StatefulWidget{
最终颜色;
最终字符串audioUrl;
常量MessageBubbleAudioPlayer({
@需要此.audioUrl,
@需要这个颜色,
});
@凌驾
_MessageBubbleAudioPlayerState createState()=>
_MessageBubbleAudioPlayerState();
}
类_MessageBubbleAudioPlayerState扩展状态{
布尔加载=假;
布尔显示=假;
双音频SeekValue=0;
最终AudioPlayer=AudioPlayer();
持续时间totalDuration=持续时间(毫秒:0);
@凌驾
void initState(){
super.initState();
WidgetsBinding.instance.addPostFrameCallback(())异步{
audioPlayer.onPlayerStateChanged.listen((事件){
如果(装入)设置状态(()=>isplay=event==PlayerState.PLAYING);
});
audioPlayer.onAudioPositionChanged.listen((事件){
最终百分比=
((event.in毫秒*100)/totalDuration.in毫秒)??0;
如果(已安装)设置状态(()=>audioSeekValue=百分比);
});
});
}
@凌驾
小部件构建(构建上下文){
返回行(
mainAxisSize:mainAxisSize.min,
儿童:[
加载
?容器(
身高:30,
宽度:30,
填充:常量边集。全部(8),
子对象:循环压缩机指示器(
颜色:widget.color,
冲程宽度:1.8,
),
)
:容器(
宽度:30,
孩子:我的钮扣(
图标:图标(显示?图标。暂停:图标。播放箭头,
颜色:widget.color),
onPressed:()异步{
if(audioPlayer.state==PlayerState.PAUSED){
audioPlayer.resume();
返回;
}
如果(!显示){
设置状态(()=>加载=真);
等待audioPlayer.play(widget.audioUrl);
audioPlayer.getDuration().then((值){
totalDuration=持续时间(毫秒:值);
设置状态(()=>loading=false);
});
}否则
等待音频播放器。暂停();
},
喷溅半径:25,
),
),
幻灯片主题(
数据:SliderThemeData(
轨道高度:1.4,
拇指形状:圆形滑块拇指形状(启用拇指半径:7)),
子:滑块(
标签:“音频”,
activeColor:widget.color,
inactiveColor:widget.color.withAlpha(100),
//对于新添加的小部件,此(值)应为0
//但是新的是100,前一个是0,
//哪个事实应该是相反的
值:audioSeekValue,
分:0,,
最高:100,
一旦改变:({},
),
)
],
);
}
}
此小部件依次用于另一个小部件,该小部件处理消息类型并显示适当的ui。
这是:

class MessageBubble扩展了无状态小部件{
最后的布尔伊森德,伊萨迪奥;
最终字符串消息;
const MessageBubble(this.message,this.isSender,this.isAudio,Key)
:super(key:key);
@凌驾
小部件构建(构建上下文){
返回填充(
填充:常量边集。对称(水平:16,垂直:3),
子对象:对齐(
对齐:isSender?对齐。中间右侧:对齐。中间左侧,
子项:message.contains(Constants.emojiRegex,0)&&
!message.contains(Constants.alphaNumericRegex)
?填充物(
填充:仅限边缘设置(
排名:6,
底图:6,
左:伊森德?16:0,
右图:isSender?0:32),
子:文本(消息,
样式:TextStyle(字体大小:45,颜色:Colors.white)),
)
:材料(
边界半径:边界半径。圆形(30),
标高:4,
颜色:isSender
?颜色。深紫色。阴影100。变暗()
:颜色。白色,
孩子:isAudio
?填充物(
填充:const EdgeInsets.symmetric(
水平:20,垂直:6),
子:MessageBubbleAudioPlayer(
key:ValueKey(message.hashCode.toString()),
audioUrl:message,
颜色:isSender
?颜色:白色
:Colors.deeppurpleacent,
),
)
:填充(
填充:const EdgeInsets.symmetric(
水平:20,垂直:14),
子:链接
class MessageBubbleAudioPlayer extends StatefulWidget {

  const MessageBubbleAudioPlayer({
    @required this.audioUrl,
    @required this.color,
    Key key.
  }) : super(key: key);
MessageBubbleAudioPlayer(audioUrl: '', color: '', key: ValueKey(#some unique int or string#)