用于隐藏和取消隐藏小部件的块模式

2024-03-11

我正在尝试从互联网获取一些数据并将其显示在列表中。

以下是我的bloc code

class StudentsBloc {
  final _repository = Repository();
  final _students = BehaviorSubject<StudentModel>();

  final BehaviorSubject<bool> _showProgress = BehaviorSubject<bool>();
  final BehaviorSubject<bool> _showNoInternetViews = BehaviorSubject<bool>();

  Observable<StudentModel> get students => _students.stream;
  Observable<bool> get showProgress => _showProgress.stream;
  Observable<bool> get showNoInternetViews => _showNoInternetViews.stream;

  //FetchStudent from my Api
  fetchStudents(String disciplineId, String schoolId, String year_id,
      String lastIndex) async {
    final student = await _repository.fetchStudents(
        disciplineId, schoolId, year_id, lastIndex);
    _students.sink.add(student);
  }

  //Check to see if user has internet or not
  isNetworkAvailable(String disciplineId, String schoolId, String year_id,
      String lastIndex) async {
    checkInternetConnection().then((isAvailable) {
      if (isAvailable) {
        fetchStudents(disciplineId, schoolId, year_id, lastIndex);
      } else {
        _students.sink.addError(NO_NETWORK_AVAILABLE);
      }
    });
  }

  Function(bool) get changeVisibilityOfProgress => _showProgress.sink.add;
  Function(bool) get changeVisibilityOfNoInternetViews =>
      _showNoInternetViews.sink.add;

  dispose() {
    _students.close();
    _showProgress.close();
    _showNoInternetViews.close();
  }
}

以下是我隐藏 unide Widgets 的主要代码

Widget buildList(StudentsBloc bloc) {
    return StreamBuilder(
      stream: bloc.students,
      builder: (context, AsyncSnapshot<StudentModel> snapshot) {
        if (snapshot.hasError) {
          bloc.changeVisibilityOfProgress(false);
          bloc.changeVisibilityOfNoInternetViews(true);

          return StreamBuilder(
            stream: bloc.showNoInternetViews,
            builder: (context, snapshot) {
              bool showNoInternetView = snapshot.hasData ?? false;

              return Visibility(
                child: Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Text("No Network Available"),
                      RaisedButton(
                        onPressed: () {
                          fetchStudents();
                        },
                        child: Text("Retry"),
                      )
                    ],
                  ),
                ),
                visible: showNoInternetView ? true : false,
              );
            },
          );
        }

        if (snapshot.hasData) {
          bloc.changeVisibilityOfProgress(false);
          bloc.changeVisibilityOfNoInternetViews(false);

          return Refresh(
            year_id: "2",
            schoolId: "1",
            lastIndex: "0",
            disciplineId: "1",
            child: ListView.builder(
              itemBuilder: (context, int index) {
                return buildTile(
                    snapshot.data.toBuilder().data.studentData[index]);
              },
              itemCount: snapshot.data.toBuilder().data.studentData.length,
            ),
          );
        }

        if (!snapshot.hasData) {
          return StreamBuilder(
            builder: (context, snapshot) {
              bool showProgressIndicator = snapshot.data ?? false;

              return Visibility(
                child: Center(
                  child: CircularProgressIndicator(),
                ),
                visible: showProgressIndicator ? true : false,
              );
            },
            stream: bloc.showProgress,
          );
        }
      },
    );
  }

The buildList方法被调用在body of Scaffold

void fetchStudents() {
    bloc?.changeVisibilityOfNoInternetViews(false);
    bloc?.changeVisibilityOfProgress(true);
    bloc?.isNetworkAvailable("1", "1", "2", "0");
  }

假设用户打开应用程序时有互联网,那么我可以看到circularprogressindicator然后数据列表可见 但假设一开始,当应用程序打开并且用户没有互联网时,我将显示“无网络可用”文本和一个重试按钮, 现在,如果用户已连接到互联网,然后单击按钮重试,我将在几秒钟后直接看到数据列表,而不是circularprogressindicator.我无法理解为什么NoInternetviews没有隐藏并且progressindicator在显示数据列表之前单击重试按钮时显示。

我的流没有在调用重试按钮时更新。有什么注意事项吗StreamBuilder within StreamBuilder?

我尝试改变StreamBuilder按照@ivenxu 在答案中提到的顺序,但它仍然不起作用。 以下是附加代码的链接https://drive.google.com/file/d/15Z8jXw1OpwTB1CxDS8sHz8jKyHhLwJp7/view?usp=sharing https://drive.google.com/file/d/15Z8jXw1OpwTB1CxDS8sHz8jKyHhLwJp7/view?usp=sharing https://drive.google.com/open?id=1gIXV20S1o5jYRnno_NADabuIj4w163fF https://drive.google.com/open?id=1gIXV20S1o5jYRnno_NADabuIj4w163fF


在视图层中你可以使用能见度()小部件并在从互联网加载数据时传递可见参数 true 或 false。 让我们考虑一下如何更改 bloc 中的可见变量。 的父母能见度()小部件的流生成器()流式传输更改数据。 对于你的情况你需要一个发布主题在您的块内传输和添加新数据,以及可观察的在您的小部件上传输此数据。

让我们展示一段代码来帮助您如何实现它

该集团包含发布主题 and 可观察的流式传输和添加数据

  //this Subject allows sending data, error and done events to the listener
  final PublishSubject<bool> _progressStateSubject = new PublishSubject();

  //the listener are streaming on changes
  Observable<bool> get progressStateStream => _progressStateSubject.stream;

  //to change your progress state
  void changeProgressState({bool state}) => _progressStateSubject.sink.add(state);

在这里您可以更改进度状态

void callWebService() async {
    //when you call your func to fetch your data change your state to true
    changeProgressState(state: true);
    .
    .
    .
    if(response != null){
      //when your call is done change the state to false
      changeProgressState(state: false);
    }
  }

您的进度小部件是

// Loading Widget
  Widget _buildLoadingWidget(Bloc bloc) {
    return StreamBuilder<bool>(
        stream: bloc.progressStateStream,//streaming on changes
        builder: (context, snapshot) {
          return Visibility(
            visible: snapshot.data ?? false,//calling when data changes
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text("Loading data from API...",
                      textDirection: TextDirection.ltr),
                  CircularProgressIndicator()
                ],
              ),
            ),
          );
        });
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于隐藏和取消隐藏小部件的块模式 的相关文章

随机推荐

  • jquery从字符串到时间的转换

    我正在开发一个系统 它以以下格式记录一天中的各个时间 06 53 22 or 19 23 58作为例子 谁能告诉我是否可以将此字符串转换为 javascript 构造 我可以用它来比较一天中的时间 您可以这样解析时间 function ti
  • 使用 -fPIC 编译的程序在跨过 GDB 中的线程局部变量时崩溃

    这是一个非常奇怪的问题 只有当程序编译时才会出现 fPIC option Using gdb我能够打印线程局部变量 但单步执行它们会导致崩溃 thread c include
  • WiX 中的新对话框,单击“后退”会跳过该对话框

    我是 WiX 的新手 正在尝试通过添加新的对话框来自定义对话框队列 新对话框的名称为 ServerChoice 流程为 SetupTypeDlg 完整或典型 ServerChoice verifyReadyDlg or SetupTypeD
  • Tomcat ExpiresFilter 无法正常工作

    我无法让 Tomcat 发送具有正确过期定义的图像 浏览器不断发送对已下载图像的 get 请求 Tomcat 响应 304 我想要的是 Tomcat 将使用正确的 expires 标头响应初始请求 并且没有任何 Last modified
  • 这是 n 层架构的正确实现吗?

    我在过去一年左右的时间里一直在学习 C 并尝试在此过程中融入最佳实践 在 StackOverflow 和其他网络资源之间 我认为我处于正确分离我的关注点的正确轨道上 但现在我有一些疑问 并希望在将整个网站转换为这个新网站之前确保我走的是正确
  • 将 null 值视为空元素的 XmlSerializer

    我正在编写一个小型 C 应用程序 它需要能够以 XML 形式读取 写入一些配置数据 我通过创建一些简单的模型类来做到这一点 其属性具有XmlElement在需要的地方添加属性 并通过一个XmlSerializer 我想要XmlSeriali
  • DBSCAN 算法可以创建少于 minPts 的簇吗?

    我刚刚编写了 DBSCAN 算法 我想知道 DBSCAN 算法是否可以允许集群中的点数少于所使用的 minPts 参数 我一直在使用http people cs nctu edu tw rsliang dbscan testdatagen
  • 在 kableExtra 表中合并迷你图

    我正在尝试创建一个带有副标题和迷你图的表格 我可以创建带有副标题的表格kableExtra包裹 我可以创建一个带有迷你图的表格formattable and sparkline包裹 但是 我无法将两者结合起来 有办法吗 我看见this ht
  • Visual Studio v.09 中的 Qt 与 C#/.NET?

    你们中有人有工作经验吗 Qt http en wikipedia org wiki Qt toolkit 和 Visual Studio 中的 C 它是否可能 易于一起使用 我已经搜索了 Qt 的 C 绑定 但所有项目似乎都已被放弃 我正在
  • python“导入错误:无法导入名称 urandom”

    不知何故 我的 python 被破坏并发出错误 jseidel EDP15 etc default python c import random Traceback most recent call last File
  • Windows 右键单击​​上下文菜单 + 子菜单

    如何在 Windows 上下文菜单中创建子菜单条目 我可以创建主菜单 但我也想关联一些子菜单 此外 如何将图标关联到菜单项 None
  • 使用 Ruby on Rails 的范围滑块

    使用Ruby on Rails 我的滑块代码如下 这给了我滑块如下 但我想要范围滑块 如下所示 它有两个滑块并给出两个值 something sliderjquery 方法 我在 ruby 中的代码应该是什么来显示滑块 如第二张图所示 我认
  • 如何使用 php mysqli 将事件的实时时间插入数据库?

    我正在尝试添加检查记录更改的日期时间 我在表中使用日期时间数据类型 date added datetime DEFAULT 0000 00 00 00 00 00 我使用以下 php 内置函数用于查询中的日期时间列 date Y m d H
  • ionic update-notifier-cordova.json' 您无权访问此文件

    我试图在 iOS 上运行 ionic 但它抛出一个错误 发生了什么 ionic run ios usr local lib node modules cordova node modules update notifier node mod
  • 检查图像文件类型

    我正在尝试向我的网站添加一个功能 用户可以将其个人资料图片设置为来自外部网址的图像 而不是将其保存到他们的电脑 然后将其上传到我的服务器 这是我到目前为止所想出的 filename inputs image url if getimages
  • Rails simple_form 属性需要标记 (*)

    我在我的应用程序中使用简单表单 我想删除 指示我的所有表单 现有表单和尚未创建的表单 都需要一个属性 我尝试过设置simple form rb Whether attributes are required by default or no
  • 在 C# 中使用 SetFilePointer 使堆栈不平衡

    好的 我在 NET 4 0 中使用 C 中的 SetFilePointer 函数 下面是我用来调用这个函数的 dllimports DllImport Kernel32 dll SetLastError true CharSet CharS
  • Numba:不支持单元格变量

    我想使用 numba 来加速此功能 from numba import jit jit def rownowaga numba u v wymiar x len u wymiar y len u 1 f 0 for j in range w
  • 使用点语言在 Graphviz 中压缩有向图

    我正在尝试实现特定图 对称排列群的凯莱图 的可视化 就像此处所做的那样 但使 用 Graphviz 2 28 和 Dot source euclideanspace com http www euclideanspace com maths
  • 用于隐藏和取消隐藏小部件的块模式

    我正在尝试从互联网获取一些数据并将其显示在列表中 以下是我的bloc code class StudentsBloc final repository Repository final students BehaviorSubject