Commit b08c33b5 authored by 林生雨's avatar 林生雨

commit

parent 1e0d0eeb
/*
* @author lsy
* @date 2020/7/4
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneListModel.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'LevelOneItem.dart';
class LevelOneList extends StatefulWidget {
double topHeight;
int planId;
String tabName;
LevelOneList(this.planId,this.tabName,this.topHeight);
@override
State<StatefulWidget> createState() => LevelOneListState();
}
class LevelOneListState extends State<LevelOneList> {
LevelOneListModel _model = LevelOneListModel();
RefreshController refreshController = RefreshController();
@override
void initState() {
super.initState();
_model.plan_id=widget.planId;
_model.tab_type=widget.tabName;
_model.refreshView(true);
}
@override
void dispose() {
refreshController.dispose();
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return baseStateView(MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height, _model.stateLive, pages(), () {
_model.refreshView(true);
},paddingTop: widget.topHeight);
}
Widget pages() {
return baseRefreshView(refreshController, () {}, null, null,
customScrollView: CustomScrollView(
// physics: NeverScrollableScrollPhysics(),
physics: ClampingScrollPhysics(),
// shrinkWrap: true,
slivers: <Widget>[
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
StreamBuilder<List<Cards>>(
stream: _model.cardsLive.stream,
initialData: _model.cardsLive.data ?? [],
builder: (c, data) {
if (data.data.isEmpty && _model.page > 1) {
refreshController.loadNoData();
} else {
refreshController.loadComplete();
}
return SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return LevelOneItem(_model.data[index]);
},
childCount: _model.data.length,
),
);
},
),
StreamBuilder<List<Cards>>(
stream: _model.cardsLive.stream,
initialData: _model.data ?? [],
builder: (c, data) {
double height = MediaQuery.of(context).size.height -
40 -
widget.topHeight -
100 * _model.data.length;
return SliverToBoxAdapter(
child: Container(
height: height < 0 ? 0 : height,
),
);
},
),
],
), onLoading: () {
_model.loadMore();
}, pullDown: false, pullUp: true);
}
}
/*
* @author lsy
* @date 2020/7/4
**/
import 'package:flutter_common/commonModel/live/BaseModel.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:flutter_common/commonModel/toast/NativeToast.dart';
import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/net/DioUtil.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class LevelOneListModel extends BaseModel {
int plan_id;
String tab_type;
int page = 1;
LiveData<int> stateLive = LiveData();
LiveData<List<Cards>> cardsLive = LiveData();
List<Cards> data = [];
RxDispose rxDispose = RxDispose();
void refreshView(bool clear, {RefreshController refreshListener}) {
if (clear) {
data.clear();
page = 1;
}
ClueApiImpl.getInstance()
.getLevelOneList(
DioUtil.getInstance().getDio(), plan_id, tab_type, page)
.listen((event) {
if (event.error == 0) {
if ((event.data.cards == null || event.data.cards.isEmpty) &&
page == 1) {
stateLive.notifyView(EMPTY);
} else {
data.addAll(event.data.cards);
cardsLive.notifyView(data);
stateLive.notifyView(ENDLOADING);
}
} else {
NativeToast.showNativeToast(event.message);
stateLive.notifyView(FAIL);
}
})
.addToDispose(rxDispose)
.onError((err) {
PrintUtil.printBug(err);
stateLive.notifyView(FAIL);
});
}
@override
void dispose() {
rxDispose.dispose();
stateLive.dispost();
cardsLive.dispost();
}
void loadMore() {
page++;
refreshView(false);
}
}
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_common/commonModel/live/BaseModel.dart'; import 'package:flutter_common/commonModel/live/BaseModel.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart'; import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:flutter_common/commonModel/toast/NativeToast.dart';
import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart'; import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanOverViewBean.dart';
import 'package:gm_flutter/commonModel/GMBase.dart'; import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart'; import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart'; import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
...@@ -15,64 +17,45 @@ import 'package:pull_to_refresh/pull_to_refresh.dart'; ...@@ -15,64 +17,45 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
class LevelOneModel extends BaseModel { class LevelOneModel extends BaseModel {
LiveData<double> appBarLive = LiveData(); LiveData<double> appBarLive = LiveData();
LiveData<List<String>> rectLive = LiveData();
LiveData<List<String>> explainLive = LiveData();
LiveData<bool> showTab = LiveData(); LiveData<bool> showTab = LiveData();
LiveData<int> topIndexLive = new LiveData(); LiveData<int> topIndexLive = new LiveData();
LiveData<double> topScrollLive = new LiveData(); LiveData<double> topScrollLive = new LiveData();
LiveData<bool> loadingLive = LiveData(); LiveData<int> stateLive = LiveData();
LiveData<double> textLive = LiveData();
RxDispose rxDispose = RxDispose(); RxDispose rxDispose = RxDispose();
LiveData<Pair<int, List<Cards>>> cardsLive = LiveData(); LiveData<Pair<int, List<Cards>>> cardsLive = LiveData();
Map<int, List<Cards>> data = new Map(); Map<int, List<Cards>> data = new Map();
List list = ["plan", "hospital", "doctor", "diary"]; List list = ["plan", "hospital", "doctor", "diary"];
List<Tabs> tabsList = [];
List pageList = [1, 1, 1, 1]; List pageList = [1, 1, 1, 1];
List pageHeightList = [118, 149, 118, 118]; List pageHeightList = [118, 149, 118, 118];
int plan_id = 0;
PlanOverData planoverItem;
void refreshView(bool clear, {RefreshController refreshListener}) { void init(VoidCallback callback) {
Future.delayed(Duration(seconds: 1), () {
Cards cards = Cards(
cardType: "plan",
plan: Plan(planName: "ww", minPrice: "50", maxPrice: "500"));
List<Cards> a = [
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
cards,
];
List<Cards> b = [cards];
print("INDEX ${currentIndex}");
if (currentIndex == 1) {
data[currentIndex] = b;
} else {
data[currentIndex] = a;
}
cardsLive.notifyView(Pair(ENDLOADING, data));
});
int index = currentIndex;
if (clear) {
data.clear();
pageList = [1, 1, 1, 1];
}
ClueApiImpl.getInstance() ClueApiImpl.getInstance()
.getLevelOneList( .getPlanOverView(DioUtil.getInstance().getDio(), plan_id)
DioUtil.getInstance().getDio(), 123, list[index], pageList[index]) .listen((event) {
.listen((event) {}) if (event.error == 0) {
planoverItem=event.data;
tabsList = event.data.tabs;
stateLive.notifyView(ENDLOADING);
callback();
} else {
NativeToast.showNativeToast(event.message);
stateLive.notifyView(FAIL);
}
})
.addToDispose(rxDispose) .addToDispose(rxDispose)
.onError((err) { .onError((err) {
PrintUtil.printBug(err); PrintUtil.printBug(err);
}); stateLive.notifyView(FAIL);
});
} }
int currentIndex = 0; int currentIndex = 0;
@override @override
...@@ -80,26 +63,13 @@ class LevelOneModel extends BaseModel { ...@@ -80,26 +63,13 @@ class LevelOneModel extends BaseModel {
showTab.dispost(); showTab.dispost();
cardsLive.dispost(); cardsLive.dispost();
appBarLive.dispost(); appBarLive.dispost();
rectLive.dispost();
topIndexLive.dispost(); topIndexLive.dispost();
topScrollLive.dispost(); topScrollLive.dispost();
loadingLive.dispost(); stateLive.dispost();
} textLive.dispost();
void selectPage(int index) {
if (currentIndex == index) {
return;
}
currentIndex = index;
if (data[currentIndex] == null) {
cardsLive.notifyView(Pair(LOADING, null));
refreshView(true);
} else {
cardsLive.notifyView(Pair(ENDLOADING, data[currentIndex]));
}
} }
void loadMore() { void selectTab(int index) {
} }
} }
...@@ -8,7 +8,7 @@ class PlanOverViewBean { ...@@ -8,7 +8,7 @@ class PlanOverViewBean {
Null extra; Null extra;
Null errorExtra; Null errorExtra;
UserType userType; UserType userType;
Data data; PlanOverData data;
PlanOverViewBean( PlanOverViewBean(
{this.error, {this.error,
...@@ -26,7 +26,7 @@ class PlanOverViewBean { ...@@ -26,7 +26,7 @@ class PlanOverViewBean {
userType = json['user_type'] != null userType = json['user_type'] != null
? new UserType.fromJson(json['user_type']) ? new UserType.fromJson(json['user_type'])
: null; : null;
data = json['data'] != null ? new Data.fromJson(json['data']) : null; data = json['data'] != null ? new PlanOverData.fromJson(json['data']) : null;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
...@@ -56,7 +56,7 @@ class UserType { ...@@ -56,7 +56,7 @@ class UserType {
} }
} }
class Data { class PlanOverData {
Banner banner; Banner banner;
String name; String name;
String positiveRate; String positiveRate;
...@@ -67,7 +67,7 @@ class Data { ...@@ -67,7 +67,7 @@ class Data {
List<ExplanationAttrs> explanationAttrs; List<ExplanationAttrs> explanationAttrs;
List<Tabs> tabs; List<Tabs> tabs;
Data( PlanOverData(
{this.banner, {this.banner,
this.name, this.name,
this.positiveRate, this.positiveRate,
...@@ -78,7 +78,7 @@ class Data { ...@@ -78,7 +78,7 @@ class Data {
this.explanationAttrs, this.explanationAttrs,
this.tabs}); this.tabs});
Data.fromJson(Map<String, dynamic> json) { PlanOverData.fromJson(Map<String, dynamic> json) {
banner = banner =
json['banner'] != null ? new Banner.fromJson(json['banner']) : null; json['banner'] != null ? new Banner.fromJson(json['banner']) : null;
name = json['name']; name = json['name'];
......
...@@ -143,42 +143,49 @@ Widget loadingItem({bool needBackground = false}) { ...@@ -143,42 +143,49 @@ Widget loadingItem({bool needBackground = false}) {
Widget netErrorItem() {} Widget netErrorItem() {}
Widget errorItem(double width, double height, VoidCallback retry, Widget errorItem(double width, double height, VoidCallback retry,
{String errorText, String retryText}) { {String errorText, String retryText,double paddingTop}) {
return Container( return Container(
width: width, width: width,
height: height, height: height,
color: Colors.white, padding: EdgeInsets.only(top: paddingTop),
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
child: Container( child: Container(
width: 180, width: 180,
height: 315.5, height: 315.5,
margin: EdgeInsets.only(top: 62), margin: EdgeInsets.only(top: 62),
child: Stack( child: Column(
alignment: AlignmentDirectional.center, children: <Widget>[
children: <Widget>[ Container(
Positioned(
left: 0,
top: 0,
child: Container(
width: 180, width: 180,
height: 186.5, height: 186.5,
child: Image.asset("assets/error.png"), child: Stack(
), alignment: AlignmentDirectional.center,
), children: <Widget>[
Positioned( Positioned(
top: 166, left: 0,
child: Container( top: 0,
width: 180, child: Container(
alignment: Alignment.center, width: 180,
child: baseText( height: 186.5,
errorText ?? "原谅我一看到美人就不淡定", 15, Color(0xff666666)), child: Image.asset("assets/error.png"),
),
),
Positioned(
top: 166,
child: Container(
width: 180,
alignment: Alignment.center,
child: baseText(
errorText ?? "原谅我一看到美人就不淡定", 15, Color(0xff666666)),
),
),
],
),
), ),
), Container(
Positioned(
bottom: 60,
child: Container(
width: 150, width: 150,
height: 40, height: 40,
margin: EdgeInsets.only(top: 17),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
gradient: LinearGradient( gradient: LinearGradient(
...@@ -190,12 +197,10 @@ Widget errorItem(double width, double height, VoidCallback retry, ...@@ -190,12 +197,10 @@ Widget errorItem(double width, double height, VoidCallback retry,
).gestureDetector(() { ).gestureDetector(() {
retry(); retry();
}), }),
), Container(
Positioned(
bottom: 0,
child: Container(
width: 150, width: 150,
height: 40, height: 40,
margin: EdgeInsets.only(top: 20),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all(color: Color(0xffFF5963), width: 0.5)), border: Border.all(color: Color(0xffFF5963), width: 0.5)),
...@@ -204,10 +209,8 @@ Widget errorItem(double width, double height, VoidCallback retry, ...@@ -204,10 +209,8 @@ Widget errorItem(double width, double height, VoidCallback retry,
).gestureDetector(() { ).gestureDetector(() {
AppSettings.openWIFISettings(); AppSettings.openWIFISettings();
}), }),
) ],
], )));
),
));
} }
//TODO //TODO
...@@ -373,8 +376,9 @@ Widget normalRefreshHeader() { ...@@ -373,8 +376,9 @@ Widget normalRefreshHeader() {
); );
} }
Widget emptyItem(double width, double height, {String detail}) { Widget emptyItem(double width, double height, {String detail,double paddingTop}) {
return Container( return Container(
padding: EdgeInsets.only(top: paddingTop),
width: width, width: width,
height: height, height: height,
color: Colors.white, color: Colors.white,
...@@ -383,20 +387,34 @@ Widget emptyItem(double width, double height, {String detail}) { ...@@ -383,20 +387,34 @@ Widget emptyItem(double width, double height, {String detail}) {
width: 175, width: 175,
height: 188, height: 188,
margin: EdgeInsets.only(top: 62.5), margin: EdgeInsets.only(top: 62.5),
child: Stack( child: Column(
alignment: AlignmentDirectional.bottomCenter, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
Container( Container(
width: 175, width: 175,
height: 188, height: 188,
child: Image.asset("assets/empty.png"), child: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
Container(
width: 175,
height: 188,
child: Image.asset("assets/empty.png"),
),
Positioned(
bottom: 17,
child: baseText(detail ?? "此处太寂寥,转转别处吧", 15, Color(0xff666666)),
)
],
),
), ),
Positioned( Container(
bottom: 17, height:0,
child: baseText(detail ?? "此处太寂寥,转转别处吧", 15, Color(0xff666666)), color: Colors.white,
) )
], ],
), )
), ),
); );
} }
...@@ -491,7 +509,7 @@ Widget baseSliverTitle(String text, double width, LiveData liveData) { ...@@ -491,7 +509,7 @@ Widget baseSliverTitle(String text, double width, LiveData liveData) {
} }
Widget baseStateView(double width, double height, LiveData<int> stateLive, Widget baseStateView(double width, double height, LiveData<int> stateLive,
Widget home, VoidCallback retry) { Widget home, VoidCallback retry,{double paddingTop}) {
return StreamBuilder( return StreamBuilder(
stream: stateLive.stream, stream: stateLive.stream,
initialData: stateLive.data ?? LOADING, initialData: stateLive.data ?? LOADING,
...@@ -499,9 +517,9 @@ Widget baseStateView(double width, double height, LiveData<int> stateLive, ...@@ -499,9 +517,9 @@ Widget baseStateView(double width, double height, LiveData<int> stateLive,
if (data.data == LOADING) { if (data.data == LOADING) {
return loadingItem(); return loadingItem();
} else if (data.data == FAIL) { } else if (data.data == FAIL) {
return errorItem(width, height, retry); return errorItem(width, height, retry,paddingTop: paddingTop);
} else if (data.data == EMPTY) { } else if (data.data == EMPTY) {
return emptyItem(width, height); return emptyItem(width, height,paddingTop: paddingTop);
} }
return home; return home;
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment