我有一个运行良好的音乐播放器,但我想将音乐播放器小部件放在StreamBuilder中,并有一个字符串,该字符串是要在流中播放的音乐的URL,并将该URL传递到音乐的构造函数中播放器。
因此,只要该URL流更改,音乐播放器的内容就会更改。
我简单的musicplayerurlservice类:
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);
}),
然后在另一个 View 中,我将有一个按钮,该按钮调用MusicPlayerURLService中的set方法并设置一个新URL。目前,由于url服务中的get方法不是流,因此流生成器会抛出错误。
我正在努力想出一些一般性的想法来解决这个问题。我可以以某种方式使用提供商吗?
编辑
网址将来自像这样的按钮:
FlatButton(
onPressed: () => MusicPlayerURLService().set("songOneUrl"),
child: Text("Play Song One"),
)
最佳答案
为此,必须创建自己的Stream
。对于这种情况,最好的方法可能是使用StreamController
。
您应该添加StreamController
作为MusicPlayerURLService
的一部分,并在构造函数中实例化它。设置新URL时,您应该告诉 Controller 也将其添加到流中。为了从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程序包在整个树中提供对象的单个实例。
关于flutter - Flutter创建一个流服务,该流服务通过streambuilder将URL发送到小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179574/