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 @@
import 'package:flutter/material.dart';
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/ClueModel/server/entity/PlanOverViewBean.dart';
import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
......@@ -15,64 +17,45 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
class LevelOneModel extends BaseModel {
LiveData<double> appBarLive = LiveData();
LiveData<List<String>> rectLive = LiveData();
LiveData<List<String>> explainLive = LiveData();
LiveData<bool> showTab = LiveData();
LiveData<int> topIndexLive = new LiveData();
LiveData<double> topScrollLive = new LiveData();
LiveData<bool> loadingLive = LiveData();
LiveData<int> stateLive = LiveData();
LiveData<double> textLive = LiveData();
RxDispose rxDispose = RxDispose();
LiveData<Pair<int, List<Cards>>> cardsLive = LiveData();
Map<int, List<Cards>> data = new Map();
List list = ["plan", "hospital", "doctor", "diary"];
List<Tabs> tabsList = [];
List pageList = [1, 1, 1, 1];
List pageHeightList = [118, 149, 118, 118];
int plan_id = 0;
PlanOverData planoverItem;
void refreshView(bool clear, {RefreshController refreshListener}) {
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;
void init(VoidCallback callback) {
ClueApiImpl.getInstance()
.getPlanOverView(DioUtil.getInstance().getDio(), plan_id)
.listen((event) {
if (event.error == 0) {
planoverItem=event.data;
tabsList = event.data.tabs;
stateLive.notifyView(ENDLOADING);
callback();
} else {
data[currentIndex] = a;
}
cardsLive.notifyView(Pair(ENDLOADING, data));
});
int index = currentIndex;
if (clear) {
data.clear();
pageList = [1, 1, 1, 1];
NativeToast.showNativeToast(event.message);
stateLive.notifyView(FAIL);
}
ClueApiImpl.getInstance()
.getLevelOneList(
DioUtil.getInstance().getDio(), 123, list[index], pageList[index])
.listen((event) {})
})
.addToDispose(rxDispose)
.onError((err) {
PrintUtil.printBug(err);
stateLive.notifyView(FAIL);
});
}
int currentIndex = 0;
@override
......@@ -80,26 +63,13 @@ class LevelOneModel extends BaseModel {
showTab.dispost();
cardsLive.dispost();
appBarLive.dispost();
rectLive.dispost();
topIndexLive.dispost();
topScrollLive.dispost();
loadingLive.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]));
}
stateLive.dispost();
textLive.dispost();
}
void loadMore() {
void selectTab(int index) {
}
}
......@@ -8,7 +8,7 @@ class PlanOverViewBean {
Null extra;
Null errorExtra;
UserType userType;
Data data;
PlanOverData data;
PlanOverViewBean(
{this.error,
......@@ -26,7 +26,7 @@ class PlanOverViewBean {
userType = json['user_type'] != null
? new UserType.fromJson(json['user_type'])
: 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() {
......@@ -56,7 +56,7 @@ class UserType {
}
}
class Data {
class PlanOverData {
Banner banner;
String name;
String positiveRate;
......@@ -67,7 +67,7 @@ class Data {
List<ExplanationAttrs> explanationAttrs;
List<Tabs> tabs;
Data(
PlanOverData(
{this.banner,
this.name,
this.positiveRate,
......@@ -78,7 +78,7 @@ class Data {
this.explanationAttrs,
this.tabs});
Data.fromJson(Map<String, dynamic> json) {
PlanOverData.fromJson(Map<String, dynamic> json) {
banner =
json['banner'] != null ? new Banner.fromJson(json['banner']) : null;
name = json['name'];
......
......@@ -143,16 +143,21 @@ Widget loadingItem({bool needBackground = false}) {
Widget netErrorItem() {}
Widget errorItem(double width, double height, VoidCallback retry,
{String errorText, String retryText}) {
{String errorText, String retryText,double paddingTop}) {
return Container(
width: width,
height: height,
color: Colors.white,
padding: EdgeInsets.only(top: paddingTop),
alignment: Alignment.topCenter,
child: Container(
width: 180,
height: 315.5,
margin: EdgeInsets.only(top: 62),
child: Column(
children: <Widget>[
Container(
width: 180,
height: 186.5,
child: Stack(
alignment: AlignmentDirectional.center,
children: <Widget>[
......@@ -174,11 +179,13 @@ Widget errorItem(double width, double height, VoidCallback retry,
errorText ?? "原谅我一看到美人就不淡定", 15, Color(0xff666666)),
),
),
Positioned(
bottom: 60,
child: Container(
],
),
),
Container(
width: 150,
height: 40,
margin: EdgeInsets.only(top: 17),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
gradient: LinearGradient(
......@@ -190,12 +197,10 @@ Widget errorItem(double width, double height, VoidCallback retry,
).gestureDetector(() {
retry();
}),
),
Positioned(
bottom: 0,
child: Container(
Container(
width: 150,
height: 40,
margin: EdgeInsets.only(top: 20),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(color: Color(0xffFF5963), width: 0.5)),
......@@ -204,10 +209,8 @@ Widget errorItem(double width, double height, VoidCallback retry,
).gestureDetector(() {
AppSettings.openWIFISettings();
}),
)
],
),
));
)));
}
//TODO
......@@ -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(
padding: EdgeInsets.only(top: paddingTop),
width: width,
height: height,
color: Colors.white,
......@@ -383,6 +387,12 @@ Widget emptyItem(double width, double height, {String detail}) {
width: 175,
height: 188,
margin: EdgeInsets.only(top: 62.5),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
width: 175,
height: 188,
child: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
......@@ -398,6 +408,14 @@ Widget emptyItem(double width, double height, {String detail}) {
],
),
),
Container(
height:0,
color: Colors.white,
)
],
)
),
);
}
......@@ -491,7 +509,7 @@ Widget baseSliverTitle(String text, double width, LiveData liveData) {
}
Widget baseStateView(double width, double height, LiveData<int> stateLive,
Widget home, VoidCallback retry) {
Widget home, VoidCallback retry,{double paddingTop}) {
return StreamBuilder(
stream: stateLive.stream,
initialData: stateLive.data ?? LOADING,
......@@ -499,9 +517,9 @@ Widget baseStateView(double width, double height, LiveData<int> stateLive,
if (data.data == LOADING) {
return loadingItem();
} else if (data.data == FAIL) {
return errorItem(width, height, retry);
return errorItem(width, height, retry,paddingTop: paddingTop);
} else if (data.data == EMPTY) {
return emptyItem(width, height);
return emptyItem(width, height,paddingTop: paddingTop);
}
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