使用StreamBuilder时,如何在用户离线时显示不同的Widget?

2024-04-28

我正在尝试从互联网上获取一些数据。随着使用FutureBuilder,处理各种情况,如离线,在线,错误很容易,但我正在使用StreamBuilder我无法理解如何处理离线案例

以下是我使用 StreamBuilder 的代码,它可以工作,但我还没有处理离线数据或错误

return StreamBuilder(
      builder: (context, AsyncSnapshot<SchoolListModel> snapshot) {
        if (snapshot.hasError) {
          return Expanded(
              child: Center(
            child: Text(SOMETHING_WENT_WRONG),
          ));
        }

        if (!snapshot.hasData) {
          return Expanded(
            child: Center(
              child: CircularProgressIndicator(),
            ),
          );
        }

        if (snapshot.data != null) {
          if (snapshot.data.status == 1) {
            return buildSchoolList(snapshot.data.schoolListData);
          } else {
            showMessageDialog(snapshot.data.msg.toString(), context);
          }
        }
        },
      stream: schoolListBloc.schoolList,
    );
  }

现在为了处理离线情况,我正在执行以下两个选项,但在我的情况下不起作用

选项一。

return StreamBuilder(
      builder: (context, AsyncSnapshot<SchoolListModel> snapshot) {
       switch (snapshot.connectionState) {
          case ConnectionState.none:
            return Text(SOMETHING_WENT_WRONG);
          case ConnectionState.active:
          case ConnectionState.waiting:
            return Expanded(
              child: Center(
                child: CircularProgressIndicator(),
              ),
            );
          case ConnectionState.done:
            if (snapshot.hasError) {
              return errorData(snapshot);
            } else {
              if (snapshot.data.status == 1) {
                return buildSchoolList(snapshot.data.schoolListData);
              } else {
                showMessageDialog(snapshot.data.msg.toString(), context);
              }
            }
        }
      },
      stream: schoolListBloc.schoolList,
    );
  }

我不断看到CircularProgressIndicator并且控制台上没有错误。 我不明白为什么上面的开关盒适用于FuturBuilder并不是StreamBuilder.

第二个选项。

Future<bool> checkInternetConnection() async {
  try {
    final result = await InternetAddress.lookup('google.com');
    if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
      print('connected');
      return true;
    }
  } on SocketException catch (_) {
    print('not connected');
    return false;
  }
  return false;
}


return StreamBuilder(
      builder: (context, AsyncSnapshot<SchoolListModel> snapshot) {
       checkInternetConnection().then((isAvailable) {
          if (isAvailable) {
            if (!snapshot.hasData || snapshot.data == null) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }

            if (snapshot.data != null) {
              if (snapshot.data.status == 1) {
                return buildSchoolList(snapshot.data.schoolListData);
              } else {
                showMessageDialog(snapshot.data.msg.toString(), context);
              }
            }
          } else {
            return Center(
              child: Column(
                children: <Widget>[
                  Text(CHECK_YOUR_INTERNET_CONNECTION),
                  RaisedButton(
                    onPressed: () {},
                    child: Text(TRY_AGAIN),
                  )
                ],
              ),
            );
          }
        }); },
      stream: schoolListBloc.schoolList,
    );
  }

使用此选项会引发以下错误

the following assertion was thrown building StreamBuilder<SchoolListModel>(dirty, state:
I/flutter ( 5448): _StreamBuilderBaseState<SchoolListModel, AsyncSnapshot<SchoolListModel>>#dd970):
I/flutter ( 5448): A build function returned null.
I/flutter ( 5448): The offending widget is: StreamBuilder<SchoolListModel>
I/flutter ( 5448): Build functions must never return null. To return an empty space that causes the building widget to
I/flutter ( 5448): fill available room, return "new Container()". To return an empty space that takes as little room as..

使用StreamBuilder时,遇到以下离线、在线、错误数据情况,应该采取什么处理方法


您可以将错误添加到Stream并抓住它StreamBuilder像这样:

_someStreamCtrl.addError(error);  // Client is offline

And in StreamBuilder:

StreamBuilder<String>(
      stream: someStream,
      initialData: [],
      builder: (BuildContext context,
          AsyncSnapshot<String> snap) {
        if (snap.hasError)
            return ErrorWidget(); //Error
        if (snap.hasData)
          return // Desired widget

        //if waiting
          return CircularProgressIndicator();
        );
      },
    );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用StreamBuilder时,如何在用户离线时显示不同的Widget? 的相关文章

  • Flutter - 每次应用程序重新启动后保留变量的值

    在我的一页上 我希望我的用户从一个变量上的默认文本开始 codeDialog 然后我希望他们更改该文本 之后他们编写的文本将成为我的新默认文本 遗憾的是我无法让它发挥作用 现在 当我重新启动应用程序并打开该屏幕时 它会重置为null 我认为
  • VSCode和flutter,如何连接多个设备?

    我在 macOS 上使用 Visual Studio Code 来开发 Flutter 应用程序 我可以在 VSC 左下角选择一个设备 我还可以使用在多个设备上运行flutter run d all 我想知道如何使用 VSC 中的调试控制台
  • Flutter - 使用 PushReplacementNamed 在路由之间传递值

    我正在尝试使用以下方式在路线之间传递值Navigator pushReplacementNamed 但我不明白 我无法弄清楚数据退出的正确语法和逻辑是什么pushReplacementNamed并得到routes key 你能帮助我吗 输入
  • 有没有办法模拟小部件或屏幕特定位置的触摸?

    我想触摸或点击小部件上的某处 而不让用户在此时明确触摸屏幕 有什么办法可以做到吗 我已经检查了SO答案 有些人建议使用 集成测试 但在未物理或以某种方式连接到笔记本电脑的设备上无法执行 集成测试 无法找到更好的措辞 我还尝试进行 hitTe
  • 如何取消配置 flutterfire?

    我们在 CLI 中使用以下命令将 flutter 应用程序与 firebase 连接 flutterfire configure 如文档中所述 https firebase flutter dev docs overview https f
  • Flutter MacOs 访问文件

    我正在尝试在 Flutter 中构建一个自定义桌面应用程序 以便能够加载图片 例如图库 为此 我将要求用户选择一个文件夹 它会自动显示图片 现在 从简单的事情开始 由于这是第一次为 Mac 开发 我只是尝试通过Image file new
  • Flutter - 当用户移动到其他(预览)屏幕时如何正确暂停相机?

    我需要pause当我移动到导航树上的另一个屏幕以节省电池和性能时相机 我尝试过了dispose cameraController 但 flutter 从另一个屏幕返回时不会重新初始化状态 但这很明显 我使用相机的主要代码 override
  • 如何在 Flutter 中更新 AnimatedList 中的数据

    如何在 Flutter 中更新 AnimatedList 中的数据 添加 删除行 我可以在 ListView 中通过更新支持数据并调用来完成此操作setState 例如 setState data insert 2 pig 不过 在 Ani
  • 如何在flutter中实现字母滚动

    有没有任何插件或方法可以在 flutter 中实现这种滚动 具体来说 右侧的字母列 例如突出显示当前字母表字母 或者如果点击某个字母 则滚动视图会直接转到该字母标题 为了按字母顺序排序 我们可以这样做List sort 对于粘性标题 我们也
  • 带 NestedScrollview 的 RefreshIndicator

    我想要 2 个带有 ListView 的选项卡页共享一个 RefreshIndicator 但是 RefreshIndicator 必须具有 Scrollable 作为子级 TabBarView 则不然 因此我尝试为每个选项卡创建 2 个
  • 在 Flutter 中显示 CircularProgressIndicator 在前面

    我想显示一个圆形栏 就像在其他小部件前面加载一样 下面是我当前正在使用的代码 它显示了循环加载 但它位于其他小部件之间 它应该在顶部 根据我尝试使用 Stack 的建议 但它仍然显示在小部件之间 我在这里做错了什么 class LoginP
  • 当 flutter 应用程序终止时,普通推送通知会默默出现或根本不出现

    我在 nodejs 上使用 firebase admin 向用户发送推送通知 https firebase google com docs admin setup https firebase google com docs admin s
  • 带有 ListTiles 和按钮行的 Flutter 下拉菜单

    我正在尝试构建一个自定义下拉菜单 如下所示 我已经成功地实现了ListTiles and Row of Buttons没有下拉菜单 但我不确定如何将所有内容嵌套在下拉菜单类中 这是我到目前为止所得到的 class HomePage exte
  • Flutter 中没有上下文的 AlertDialog

    我想在 http 获取失败时显示 AlertDialog 函数显示对话框 https api flutter dev flutter material showDialog html https api flutter dev flutte
  • Flutter:致命错误:回调查找失败! (带有音频播放器包)

    以下代码片段是按钮 单击该按钮会发出短促的蜂鸣声 FlatButton onPressed gt final player new AudioCache player play note1 wav child Text Click to d
  • Dart 流 .asBroadcastStream 内存泄漏

    在我们的 Flutter 应用程序中 我们存在内存泄漏和流未关闭的情况 我们追踪源代码如下 Rx combineLatest asBroadcastStream RxDart的结果 combineLatest 是单订阅流 添加 asBroa
  • 更改语言 Flutter 的按钮

    我正在 Flutter 中构建一个应用程序 到目前为止 我正在使用 JSON 国际化 其中应用程序的语言基于用户手机中默认的语言 它工作得很好 但我想给用户有机会在不更改手机系统语言设置的情况下更改语言 只需单击按钮 然后应用程序即可更改语
  • Flutter:如何移动文本字段字符计数器?

    标题很好地总结了这个问题 我有一个TextField with a maxLength 250这就是它的样子 有没有办法把柜台放在其他地方 最好位于发送按钮的左侧 但也可能位于发送按钮的上方和左侧TextField 有任何想法吗 谢谢 可能
  • BottomAppBar浮动操作按钮凹口/插入不透明

    我添加了一个BottomAppBar到材质应用程序中的脚手架 并且我添加了一个在中心带有插图的工厂 代码看起来有点像这样 Scaffold bottomNavigationBar BottomAppBar color Theme of co
  • 打开键盘会导致有状态小部件重新初始化

    我在 Stable 分支中使用 Flutter 1 2 1 为了说明我的问题 假设我有页面 A 和 B A 使用以下命令导航到 BNavigator pushB 使用以下命令导航回 ANavigator pop 两者都是有状态的小部件 当我

随机推荐

  • Espresso,查找对话框并将其关闭

    我试图找到一个对话框取消按钮并将其推入 Espresso UI 测试 但我做不到 这是我的代码 onView withId R id dialog close button check matches isDisplayed 最好的解决方案
  • 使用两个键执行自动完成 - Material UI with React

    当使用两个值之一搜索时 我试图自动完成输入 title and year 但是 它仅在我搜索时才有效title 当我搜索时year 它不显示任何选项 示例代码 export default function ComboBox return
  • 检查字符串是否多次包含子字符串[重复]

    这个问题在这里已经有答案了 要搜索字符串内的子字符串 我可以使用contains 功能 但是如何检查一个字符串是否多次包含子字符串呢 优化这一点 对我来说 知道有多个结果而不是有多少就足够了 尝试利用快速IndexOf and LastIn
  • 如何将函数转发/别名/委托给方法?

    我想将函数转发到另一个模块中的方法 而不重复所有类型注释 也不手动传递参数 我该怎么做 mod other mod static client other mod Client other mod Client new async fn s
  • 如何获得 GTK 中的默认颜色?

    Context 在 GTK 3 中 人们可以设置自己的主题 甚至默认主题 Adwaita 也提供两种变体 浅色和深色 当我编写自己的小部件 用Python 时 我需要获取这些颜色以避免在黑色上绘制黑色或在白色上绘制白色 Question 如
  • 如何编辑 .csproj 文件

    当我使用 NET Framework 4 0 MSBUILD EXE 文件编译 csproj 文件时 出现错误 在 website01 csproj 的当前上下文中找不到 lable01 实际上 我需要添加每个 ASP NET 页面及其代码
  • 如何在 Mongoose 中设置文档创建的 TTL 日期?

    我正在尝试做一个promoCodeMongoose 中的架构 创建时 我需要能够设置促销代码的到期日期 促销代码不一定相同TTL 我在看这个问题 https stackoverflow com questions 14597241 sett
  • 如何将自定义http标头添加到角度模块联合remoteEntry.js加载调用?

    我有一个主机应用程序和一些微前端应用程序都是 Angular 15 我用过 angular architects module federation 15 0 3 一切工作正常 除了我无法拦截加载 mfe 应用程序的 remoteEntry
  • 如何用opengl制作2D地形?

    我想制作一个简单的二维地形 只有一些颠簸和高度变化 我想过只使用随机数来描述某个顶点的高度 但我不知道如何从中制作一个网格 我正在寻找一种方法来查找地形的顶点和索引缓冲区 我该怎么做呢 您可以仅将 GL POLYGON 与所有顶点的列表一起
  • Delphi是否存在无锁队列“多个生产者-单个消费者”?

    我发现了几个针对单个生产者 单个消费者的实现 但没有找到多个生产者 单个消费者的实现 Delphi是否存在 多个生产者 单个消费者 的无锁队列 无锁队列全线程库 http otl 17slon com支持多个生产者 您可以将它与线程库分开使
  • #region 描述编译到.net 中的.exe 中?

    region endregion 指令 描述 是否编译到 NET 中的 EXE 中 我知道注释不是 但我经常在一个区域内对代码组进行分块并给出有用的描述 我想确保这些描述在我编译的代码中不可见 我不是在寻找混淆信息 不过 谢谢 不 他们不是
  • 包括 pandas groupby 聚合中缺失的值组合

    Problem 在 pandas groupby 聚合的输出中包括所有可能的值或值的组合 Example 示例 pandas DataFrame 有三列 User Code and Subtotal import pandas as pd
  • 链接的 ostream 内部行为及其在 MSVC 上的结果(与 Clang 相比)

    MSVC 与 GCC Clang 的流 内部字符串和操作排序问题 大家好 我最近刚刚开始更认真地使用 MSVC 来完成我的一个跨平台项目 同时通过以下方式测试输出chainedSTD 流 IE 一系列的obj foo lt lt endl
  • 让 clang-tidy 修复头文件

    我正在将当前使用 gcc 编译的项目移至 clang 并有一堆 gcc 没有生成的警告 Winconsistent missing override clang tidy致力于修复这些错误 cpp文件 但是它不触及hpp文件 因为在数据库中
  • 本地门控签入失败,并显示“无法找到搁置集...无法签入”

    我在使用新的 TFS 2015 Update 2 门控版本时遇到问题 在尝试签入门控构建队列后 构建的每个部分都会成功 直到到达 签入门控更改 的最后一步 当我查看该步骤的日志时 我得到 Error The shelveset Build
  • 如何在 C++ 中检查文件是否已被另一个应用程序打开?

    我知道 有is open C 中的函数 但我希望一个程序检查文件是否尚未被另一个应用程序打开 有没有办法使用标准库来做到这一点 编辑 在答案中澄清这是针对 Linux 应用程序的 不仅标准库没有这个功能 一般来说也是不可能的 你可以 在li
  • 如何在 CFscript 中指定参数属性? (CF9)

    在 CF9 文档中 在 CFScript 中定义组件和函数 http help adobe com en US ColdFusion 9 0 Developing WSE99A664D 44E3 44d1 92A0 5FDF8D82B55C
  • 如何复制添加到 StoryBoard 中 ViewController 的 UIView 并保持约束?

    我创建了一个视图 CustomView xib 和一个专用类 CustomView swift 我已通过添加视图并将自定义类设置为 CustomView swift 将其添加到 Storyboard 中的 ViewController 中
  • Android 中的 RoboSpice 库是什么

    我正在尝试了解 android 中的 RoboSpice 库 我在这里看到了在线文档 https github com stephanenicolas robospice wiki Starter Guide 我尝试过什么 我之前研究过使用
  • 使用StreamBuilder时,如何在用户离线时显示不同的Widget?

    我正在尝试从互联网上获取一些数据 随着使用FutureBuilder 处理各种情况 如离线 在线 错误很容易 但我正在使用StreamBuilder我无法理解如何处理离线案例 以下是我使用 StreamBuilder 的代码 它可以工作 但