【问题标题】:Flutter create a stream service that sends a URL to a widget through streambuilderFlutter 创建流服务,通过 streambuilder 将 URL 发送到小部件
【发布时间】:2020-07-30 18:53:18
【问题描述】:

我有一个可以正常工作的音乐播放器,但我想将音乐播放器小部件放在 StreamBuilder 中,并有一个字符串作为要在流中播放的音乐的 url,并将该 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 方法不是流,因此流构建器抛出错误。

我正在努力想出解决这个问题的一般想法。我可以以某种方式使用提供程序吗?

编辑

网址将来自像这样的按钮:

FlatButton(
  onPressed: () => MusicPlayerURLService().set("songOneUrl"),
  child: Text("Play Song One"),
)

【问题讨论】:

  • 你从哪里得到这些网址?
  • 它是否向你展示了一个未来?
  • @AbirAhsan get() 不返回未来,它返回一个字符串。 OP 发布了该代码。
  • @ChristopherMoore 点击时 url 将来自按钮小部件,我在帖子中放了一个示例代码
  • 为什么每次使用 MusicPlayerURLService 的其中一种方法时都要创建新的对象?

标签: flutter dart


【解决方案1】:

有必要创建自己的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);
  }
}

此方法涉及将 same 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 包在整个树中提供对象的单个实例。

【讨论】:

  • 谢谢!现在玩这个
  • 我选择了 Streamprovider.value (value: MusicPlayerURLService.getStream(), child: MusicPlayer) 然后在构建方法中的音乐播放器内部: String url = Provider.of (语境);但是当我在音乐播放器中创建一个文本小部件显示 url 时,什么都没有通过
  • @MikaelWills 向您的流中添加一个侦听器并打印值以检查您是否正确使用它。
  • 在服务类中添加了一个监听器,它正在工作并打印出通过的 url。 url 输入:FlatButton( onPressed: () => MusicPlayerURLService().set("songOneUrl"), child: whiteText("Play Song One"), ),
  • 刚刚尝试了一个消费者,但也没有在小部件树中获取流值 Consumer( builder: (context, url, child) { return whiteText("url: $url") ; }, ),
猜你喜欢
  • 2015-11-07
  • 1970-01-01
  • 2023-03-19
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2014-05-10
  • 2014-09-09
相关资源
最近更新 更多