flutter - Flutter创建一个流服务,该流服务通过streambuilder将URL发送到小部件

标签 flutter dart

我有一个运行良好的音乐播放器,但我想将音乐播放器小部件放在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/

相关文章:

firebase - 当我为 flutter web 添加 firebase 时,我的应用程序将无法运行

android - 如何在 Flutter 中读取音频扩展并显示在 ListView 中?

flutter - 在 Stack 中的两个小部件之间传递所有手势

flutter - Flutter FutureBuilder不会更新

ios - 无法执行 flutter 构建 ios

flutter - 我的用户登录后如何使用提供商通知?

Flutter Streambuilder 到数据表标题重复

dart - pubspec.yaml 中如何设置使用最新版本的包?

flutter - 如何通过 Flutter web 直接发送电子邮件

flutter - 导航不会使用自定义小部件更新 TabBarView 主体