【问题标题】:How to automatically refresh Stream Builder如何自动刷新 Stream Builder
【发布时间】:2020-12-28 07:32:06
【问题描述】:

我有一个流构建器调用一个未来函数。 我需要流生成器自动更新,但只有在我关闭并重新打开应用程序时才会刷新我该怎么办,请给我一个解决方案。 我的代码:

StreamBuilder(
      stream: _databaseService.fetchNames(uid, 'Users').asStream(),
      builder: (context, AsyncSnapshot snapshot) {
        print(snapshot);
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return Container(
              child: Center(
                  child: CircularProgressIndicator(
                valueColor: AlwaysStoppedAnimation<Color>(secondaryColor),
              )),
            );
            break;
          case ConnectionState.active:
            return Container(
              child: Center(
                  child: CircularProgressIndicator(
                valueColor: AlwaysStoppedAnimation<Color>(secondaryColor),
              )),
            );
            break;
          case ConnectionState.done:
            if (snapshot.data == 'No data') {
              return Container(
                child: Center(child: Text('No Chats')),
              );
            } else if (snapshot.data != 'No data') {
              List names = snapshot.data['collection'];
              return ListView(
                physics: BouncingScrollPhysics(),
                padding: EdgeInsets.only(top: 10),
                children: names
                    .map((e) => ListTile(
                        onTap: () {
                          Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) => ChatScreen(
                                      username: e['name'],
                                      receiverUid: e['id'])));
                        },
                        leading: CircleAvatar(
                          backgroundColor: secondaryColor,
                          child: Icon(
                            Icons.person,
                            color: Colors.white,
                          ),
                        ),
                        title: Padding(
                          padding: const EdgeInsets.only(top: 5.0),
                          child: Text(
                            e['name'].toString()[0].toUpperCase() +
                                e['name'].toString().substring(
                                      1,
                                    ),
                            style: TextStyle(fontSize: 25),
                          ),
                        )))
                    .toList(),
              );
            }
            break;
          case ConnectionState.none:
            return Container(
              child: Center(child: Text('No network')),
            );
            break;
        }
        return Container(
          child: Center(
              child: CircularProgressIndicator(
            valueColor: AlwaysStoppedAnimation<Color>(secondaryColor),
          )),
        );
      },
    )

我的未来功能:

Future fetchNamesId(documentName, collectionName) async {
    Response response = await post(url,
        headers: {
          "Content-Type": "application/json; charset=utf-8",
        },
        body: jsonEncode(
            {"documentName": documentName, "collectionName": collectionName}));
    if (response.body == "No data") {
      return "No data";
    }
    return jsonDecode(response.body);
  }

这是我得到的数据流,即 sanpshot.data:

{collection: [{id: 7hgIFK07xwhDGM82kJiQyGua36E3, name: bvc}, {id: Fgtf4ikE0QPifgknq5AVUdxCV2V2, name: vee}, {id: GbYWYJXcKwMmjsbx99QCvw0gWVL2, name: luu}, {id: egkH6fX7B2db54V1ALYWbKAXwG33, name: dia}]}

每当我在数据库中添加另一个值时,流都不会自动刷新,我需要关闭并重新打开选项卡。

在代码中,我将其设为异步,但即使它没有自动更新。

请给我一个解决方案,我很震惊。 提前致谢。

【问题讨论】:

    标签: flutter dart stream


    【解决方案1】:

    看起来与您的数据库的连接是一次性请求。您的应用程序不知道服务器上的任何更改。我认为你可以做几件事:

    1. 使用诸如 Firebase Firestore 之类的服务将更新“自动”推送到您的应用
    2. 在您的应用程序中实现 Web 套接字。您还需要在服务器上实现 Web 套接字
    3. 每隔 x 分钟通过循环与服务器联系一次(易于实施,但不推荐,因为它可能会消耗用户设备的电池寿命)

    【讨论】:

    • 非常感谢您的帮助
    【解决方案2】:

    我建议使用提供者。您可以像这样将 StreamBuilder 包装到 StreamProvider:

      @override
      Widget build(BuildContext context) {
        return StreamProvider<whatever your stream returns>.value(
          value: your stream,
          child: StreamBuilder(...
    

    【讨论】:

    • 不,它不会自动刷新。我该怎么做你能解释清楚。它仅在我关闭并重新打开应用程序时显示新值,我需要它在不自动关闭和重新打开应用程序的情况下发生。
    • 你能分享你如何接收你的流数据,也许我可以帮忙。
    • 就像@Marthijn 说你只获取一次。我不知道如何将其转换为流 tbh,但如果您这样做,您的应用程序将侦听数据库中的更改。一个更简单的解决方案是使用 Cloud Firestore 作为您的数据库。在这种情况下,很容易获取流。
    • 非常感谢您的帮助。
    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2013-02-23
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多