1.页面状态的bloc封装
1.1 定义一个基类用于bloc用于处理页面状态
状态主要有:loading,error,empty,以及展示内容的showContent
enum PageEnum {
showLoading,
showError,
showEmpty,
showContent,
}
1.2 定义一个枚举表示页面状态,另外还需定义事件的类,传递一些必要的数据
bloc流供baseWidget做状态的变化
class PageStatusEvent {
String errorDesc; //错误数据,主要是展示错误页面
bool isRefresh;//主要用于list列表数据
PageEnum pageStatus; 页面状态
PageStatusEvent({this.errorDesc,this.isRefresh, this.pageStatus});
}
1.3 BaseBloc封装
class BaseBloc {
void dispose() {
_pageEvent.close();
}
///请求专用的类
Repository repository = new Repository();
///主要是事件通知
BehaviorSubject<PageStatusEvent> _pageEvent =
BehaviorSubject<PageStatusEvent>();
get pageEventSink => _pageEvent.sink;
get pageEventStream => _pageEvent.stream.asBroadcastStream();
postPageEmpty2PageContent(bool isRefresh, Object list) {
pageEventSink.add(new PageStatusEvent(errorDesc : "", isRefresh: true,
pageStatus: ObjectUtil.isEmpty(list)
? PageEnum.showEmpty
: PageEnum.showContent));
}
postPageError(bool isRefresh, String errorMsg) {
pageEventSink.add(
new PageStatusEvent(errorDesc : errorMsg, isRefresh: isRefresh, pageStatus: PageEnum.showError));
}
}
主要提供了页面状态的Stream,提供子类使用,postPageEmpty2PageContent,postPageError 主要是的页面状态调用方法
2.BaseWidget封装
@override
Widget build(BuildContext context) {
return _buildWidgetDefault();
}
///构建默认视图
Widget _buildWidgetDefault() {
return WillPopScope(
child: Scaffold(
appBar: buildAppBar(),
body: _buildBody(),
),
);
}
///子类实现,构建各自页面UI控件
Widget buildWidget(BuildContext context);
///构建内容区
Widget _buildBody() {
bloc = BlocProvider.of<B>(context);
return new StreamBuilder(
stream: bloc.pageEventStream,
builder:
(BuildContext context, AsyncSnapshot<PageStatusEvent> snapshot) {
PageStatusEvent status;
bool isShowContent = false;
if (snapshot == null || snapshot.data == null) {
isShowContent = false;
status =
PageStatusEvent(errorDesc : "", isRefresh: true, pageStatus: PageEnum.showLoading);
} else {
status = snapshot.data;
if ((!status.isRefresh) ||
(status.pageStatus == PageEnum.showContent &&
status.isRefresh)) {
isShowContent = true;
} e