我试图从互联网上获取一些数据。使用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时,在以下情况下需要处理离线,在线和错误数据的情况

最佳答案

您可以将Error添加到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();
        );
      },
    );

关于dart - 用户在使用StreamBuilder时离线时如何显示不同的Widget?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54268534/

10-11 01:15