我有一个工作得很好的音乐播放器,但是我想把音乐播放器小部件放在一个StreamBuilder中,并有一个字符串,它是要在流中播放的音乐的url,并将该url传递到音乐播放器的构造函数中。因此,每当url流发生变化时,音乐播放器的内容就会发生变化。
我的简单音乐剧服务班:
class MusicPlayerURLService {
String url = '';
String get(){
return url;
}
void set(String newUrl) {
url = newUrl;
}
}
音乐播放器小部件的构造函数:
StreamBuilder(
stream: MusicPlayerURLService().get(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
var user = snapshot.data;
if (user == null) {
return Container(width: 20);
}
return MusicPlayer(url: snapshot.data.url);
}
return Container(width: 20);
}),
然后,在另一个视图中,我将有一个按钮来调用MusicPlayerURLService中的set方法,并设置一个新的URL。
目前,流生成器抛出并出错,因为url服务中的get方法不是流。
我很难想出解决这个问题的一般想法。我能用个提供者吗?
编辑
urls将来自如下按钮:
FlatButton(
onPressed: () => MusicPlayerURLService().set("songOneUrl"),
child: Text("Play Song One"),
)
发布于 2020-07-30 19:25:55
有必要创建自己的Stream
来完成这一任务。在这种情况下,最好的方法可能是使用StreamController
。
您应该添加一个StreamController
作为MusicPlayerURLService
的一部分,并在构造函数中实例化它。在设置新URL时,应该告诉控制器将其添加到流中。要从StreamController
获取流,请创建一个返回controller.stream
的新方法。
例如。
class MusicPlayerURLService {
String url = '';
StreamController<String> controller;
MusicPlayerURLService() {
controller = StreamController();
controller.add(url);
}
String get(){
return url;
}
Stream<String> getStream() {//Use this in your StreamBuilder
return controller.stream;
}
void set(String newUrl) {
url = newUrl;
controller.add(url);
}
}
此方法涉及将相同的MusicPlayerURLService
对象传递到它需要使用的任何地方。您可以让必要的部件保持静态状态,如下所示:
class MusicPlayerURLService {
static StreamController<String> controller = StreamController();
static Stream<String> getStream() {//Use this in your StreamBuilder
return controller.stream;
}
static void set(String newUrl) {
controller.add(newUrl);
}
}
或者,如果您认为有必要,可以使用Provider包使对象的单个实例在整个树中可用。
https://stackoverflow.com/questions/63179574
复制相似问题