【问题标题】:How to show different Widget when user is offline while using StreamBuilder?当用户在使用 StreamBuilder 时离线时如何显示不同的 Widget?
【发布时间】:2019-06-13 13:52:11
【问题描述】:

我正在尝试从互联网上获取一些数据。使用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时,出现以下离线、在线和错误数据的情况应该采取什么方法

【问题讨论】:

    标签: dart flutter rxdart stream-builder


    【解决方案1】:

    您可以将错误添加到Stream 并在StreamBuilder 中捕获它,如下所示:

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

    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();
            );
          },
        );
    

    【讨论】:

    • 会尽力让你知道
    猜你喜欢
    • 2014-05-30
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2014-05-14
    • 2019-03-12
    相关资源
    最近更新 更多