0

我正在颤振中使用 mvp 构建移动应用程序。我面临的问题是我用来制作产品屏幕和订单屏幕的代码是相同的,使用流生成器。但是在产品屏幕的情况下,代码工作得非常好,显示圆形进度指示器,但是当我导航到订单屏幕时,它首先在订单屏幕上显示一个错误,而不是圆形进度指示器,几毫秒后,当它得到响应时,它显示结果。为了更好地理解,我还附上了视频。https://www.youtube.com/watch?v=X4QX1-sKS9k

有状态小部件的初始化状态方法和构建方法也是相同的,但我没有遇到我在代码中做错的问题。下面是导致问题的订单屏幕构建状态的代码。

构建顺序方法:

@override
Widget build(BuildContext context) {
  return Scaffold(
    backgroundColor: Colors.white,
    appBar: AppBar(
      backgroundColor: Colors.orange,
      automaticallyImplyLeading: false,
      title: Text(
        'Orders',
        style: TextStyle(color: Colors.white),
      ),
    ),
    body: widget.myList.isNotEmpty //TODO update it remove the parameters
      ? orderListView(widget.myList)
      : StreamBuilder(
        stream: orderPresenter.getOrders,
        builder: (context, AsyncSnapshot<OrdersList> snapshot) {
          if (snapshot.hasData) {
            return orderListView(
              snapshot.data.orders //TODO update it remove the parameters
            ); 
          } else if (snapshot.data.orders.isEmpty) {
            return Center(child: Text('Your orders are empty'),);
          } else if (snapshot.hasError) {
            return Text(snapshot.error.toString());
          }

          return Center(
            child: Container(
              child: CircularProgressIndicator(),
            ),
          );
        },
      ),
  );
}

在订单演示者中,我们有

final _ordersFetcher = PublishSubject<OrdersList>();

@override
Observable<OrdersList> get getOrders => _ordersFetcher.stream;

对我有用的解决方案:

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

                }else 
                  if(snapshot.hasData){
                  orderListView(snapshot.data
                      .orders);
                }
4

1 回答 1

0

您没有检查snapshot.data.orders可能是null. 这就是您视频中的错误所显示的内容。检查 null 并显示CircularProgressIndicator()它为 null 的时间。您可以将其添加到您的第一个 if 中,并且null它将默认为您CircularProgressIndicator()在末尾已经存在StreamBilder

if (snapshot.hasData || snapshot.data.orders != null) {
  return orderListView(
    snapshot.data.orders //TODO update it remove the parameters
  ); 
}
于 2020-01-02T16:42:04.763 回答