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) {
}
}
......@@ -3,6 +3,7 @@
* @date 2020/6/29
**/
import 'dart:math';
import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
......@@ -10,7 +11,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_boost/flutter_boost.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneItem.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneList.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneModel.dart';
import 'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoPage.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/util/PosUtil.dart';
import 'package:gm_flutter/ClueModel/view/FiveStarView.dart';
......@@ -27,8 +30,8 @@ class LevelOnePage extends StatefulWidget {
State<StatefulWidget> createState() => LevelOneState();
}
class LevelOneState extends BaseState<LevelOnePage>
with TickerProviderStateMixin {
class LevelOneState extends BaseState<LevelOnePage> {
int planId = 10;
LevelOneModel _model = new LevelOneModel();
RefreshController _refreshController = RefreshController();
PageController pageController = new PageController();
......@@ -41,26 +44,16 @@ class LevelOneState extends BaseState<LevelOnePage>
@override
void initState() {
super.initState();
Future.delayed(Duration(seconds: 3), () {
_model.loadingLive.notifyView(false);
_model.refreshView(true);
_model.init(() {
setState(() {});
});
pageController.addListener(() {
if (screenWidth != null) {
_model.topScrollLive.notifyView(
pageController.offset / screenWidth * (screenWidth / 4));
}
});
oneList.add(head());
oneList.add(good());
oneList.add(rect());
oneList.add(explain());
oneList.add(Container(
height: 5,
color: Color(0xffF7F6FA),
));
oneList.add(feed());
oneList.add(pages());
// pageController.addListener(() {
// if (screenWidth != null) {
// _model.topScrollLive.notifyView(
// pageController.offset / screenWidth * (screenWidth / 4));
// }
// });
}
void _onScroll(double offset) {
......@@ -104,176 +97,127 @@ class LevelOneState extends BaseState<LevelOnePage>
@override
Widget buildItem(BuildContext context) {
oneList.clear();
oneList.add(good());
oneList.add(rect());
oneList.add(explain());
oneList.add(Container(
height: 5,
color: Color(0xffF7F6FA),
));
screenWidth = MediaQuery.of(context).size.width;
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: StreamBuilder<bool>(
stream: _model.loadingLive.stream,
initialData: true,
builder: (c, data) {
if (data.data) {
return loadingItem();
} else {
return home();
}
},
)));
child: baseStateView(
MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height,
_model.stateLive,
newHomeWarp(), () {
_model.init(() {
setState(() {});
});
})));
}
Widget home() {
return Column(
Widget newHomeWarp() {
return Stack(
children: <Widget>[
Expanded(
child: Stack(
children: <Widget>[
MediaQuery.removePadding(
removeTop: true,
context: context,
Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: NotificationListener(
onNotification: (scrollNotification) {
if (scrollNotification is KeepAliveNotification ||
scrollNotification is OverscrollIndicatorNotification) {
return false;
}
if (scrollNotification is ScrollUpdateNotification &&
scrollNotification.metrics.axisDirection.index == 2) {
_onScroll(scrollNotification.metrics.pixels);
scrollNotification.metrics.axisDirection.index == 2) {}
if (scrollNotification.depth == 0) {
if (scrollNotification.metrics.pixels > 80) {
_model.textLive.notifyView(
(scrollNotification.metrics.pixels - 80) / 40 > 1.0
? 1.0
: (scrollNotification.metrics.pixels - 80) / 40);
} else {
_model.textLive.notifyView(0.0);
}
} else if (scrollNotification.depth == 2) {
if (scrollNotification.metrics.pixels < 50 &&
scrollNotification.metrics.pixels > 0) {
_model.textLive.notifyView(1.0);
}
}
return false;
},
child: baseRefreshView(
_refreshController,
() {
//TODO
// _refreshController.refreshCompleted();
},
null,
null,
customScrollView: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return oneList[index];
},
childCount: oneList.length,
),
),
],
),
pullUp: true,
onLoading: () {
_model.loadMore();
},
),
child: newHome(),
)),
StreamBuilder<double>(
stream: _model.appBarLive.stream,
initialData: _model.appBarLive.data ?? 0.0,
builder: (c, data) {
return Opacity(
opacity: data.data,
child: Container(
height: 86,
decoration: BoxDecoration(color: Colors.white),
child: Center(
child: Padding(
padding: EdgeInsets.only(top: 20),
child: Text('文案'),
),
),
),
);
},
),
Positioned(
top: 86,
child: StreamBuilder<bool>(
stream: _model.showTab.stream,
initialData: _model.showTab.data ?? false,
builder: (c, data) {
return Visibility(
visible: data.data,
child: Container(
width: MediaQuery.of(context).size.width,
color: Colors.white,
child: MessageBarView(
topIndexLive: _model.topIndexLive,
topScrollLive: _model.topScrollLive,
pageController: pageController,
),
));
},
),
),
baseSliverTitle(
"title", MediaQuery.of(context).size.width, _model.textLive),
baseSliverBack(() {
Navigator.of(context).pop();
})
}),
],
),
),
Container(
height: 0.5,
width: double.maxFinite,
color: Color(0xffE5E5E5),
),
Container(
width: double.maxFinite,
height: 55,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 18),
width: 30,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
width: 22,
height: 22,
child: Image.asset("assets/vs_black.png"),
),
Container(
margin: EdgeInsets.only(top: 3),
child: baseText("去比较", 10, Color(0xff282828)),
)
],
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {},
child: Container(
margin: EdgeInsets.only(left: 15),
width: 135,
height: 40,
decoration: BoxDecoration(
color: Color(0xff51CDC7),
borderRadius: BorderRadius.circular(20)),
alignment: Alignment.center,
child: baseText("咨询", 14, Colors.white, bold: true),
)),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {},
);
}
Widget newHome() {
List<Widget> list = [];
var d = MediaQueryData.fromWindow(window).padding.top;
for (int i = 0; i < _model.tabsList.length; i++) {
list.add(
LevelOneList(planId, _model.tabsList[i].tabType, kToolbarHeight + d).toActive());
}
final double statusBarHeight = MediaQuery.of(context).padding.top;
final double pinnedHeaderHeight = statusBarHeight + kToolbarHeight;
return DefaultTabController(
length: _model.tabsList.length,
child: NestedScrollView(
headerSliverBuilder:
(BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverOverlapAbsorber(
handle:
NestedScrollView.sliverOverlapAbsorberHandleFor(
context),
sliver: baseSliverAppBar(
// _model.imageUrl
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w")),
SliverList(
delegate: SliverChildBuilderDelegate((BuildContext c, int i) {
if(i==0){
return Container(
height: pinnedHeaderHeight,
);
}
return oneList[i-1];
}, childCount: oneList.length+1)),
SliverPersistentHeader(
pinned: true,
delegate: StickyTabBarDelegate(
child: Container(
margin: EdgeInsets.only(left: 15),
width: 135,
height: 40,
decoration: BoxDecoration(
color: Color(0xffF96079),
borderRadius: BorderRadius.circular(20)),
alignment: Alignment.center,
child: baseText("获取底价", 14, Colors.white, bold: true),
color: Colors.white,
child: baseTabBar(null, getTabs(), (index) {
_model.selectTab(index);
}, scroll: false),
)),
Expanded(
child: Container(),
)
],
),
)
],
);
];
},
body: TabBarView(children: list)));
}
List<Widget> getTabs() {
List<Widget> list = [];
for (int i = 0; i < _model.tabsList.length; i++) {
list.add(baseTabBarItem(_model.tabsList[i].name,
leftPadding: i == 0 ? 24 : 28,
rightPadding: i == _model.tabsList.length - 1 ? 24 : 28));
}
return list;
}
Widget head() {
......@@ -292,8 +236,13 @@ class LevelOneState extends BaseState<LevelOnePage>
}
Widget good() {
if (_model.planoverItem == null) {
return Container(
width: double.maxFinite,
height: 54,
);
}
return Container(
width: MediaQuery.of(context).size.width,
height: 54,
margin: EdgeInsets.only(top: 18, bottom: 12),
child: Stack(
......@@ -301,12 +250,14 @@ class LevelOneState extends BaseState<LevelOnePage>
Positioned(
top: 6,
left: 15,
child: baseText("TODO", 18, Color(0xff282828), bold: true),
child: baseText(_model.planoverItem.name, 18, Color(0xff282828),
bold: true),
),
Positioned(
bottom: 8,
left: 15,
child: baseText("TODO", 12, Color(0xff999999)),
child: baseText(
_model.planoverItem.planDescription, 12, Color(0xff999999)),
),
Positioned(
right: 0,
......@@ -331,16 +282,18 @@ class LevelOneState extends BaseState<LevelOnePage>
baseText("好评率", 11, Color(0xff282828)),
Container(
margin: EdgeInsets.only(left: 4),
child: baseText("99", 20, Color(0xffFF5963)),
child: baseText("${_model.planoverItem.positiveRate}", 20,
Color(0xffFF5963)),
),
baseText("%", 11, Color(0xffFF5963)),
// baseText("%", 11, Color(0xffFF5963)),
],
),
),
Positioned(
right: 15,
bottom: 8,
child: baseText("销量110", 11, Color(0xff666666)),
child: baseText(
"销量${_model.planoverItem.salesCount}", 11, Color(0xff666666)),
)
],
),
......@@ -348,12 +301,14 @@ class LevelOneState extends BaseState<LevelOnePage>
}
Widget rect() {
return StreamBuilder<List<String>>(
stream: _model.rectLive.stream,
initialData: ["w", "w", "q", "w"],
builder: (c, data) {
if (_model.planoverItem == null) {
return Container(
height: 62,
);
}
List<Widget> list = List();
for (int i = 0; i < data.data.length; i += 2) {
int i = 0;
_model.planoverItem.overviewAttrs.forEach((element) {
list.add(Expanded(
child: Container(
alignment: Alignment.center,
......@@ -361,20 +316,21 @@ class LevelOneState extends BaseState<LevelOnePage>
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
baseText(data.data[i], 14, Color(0xff282828), bold: true),
baseText(data.data[i + 1], 11, Color(0xff999999)),
baseText(element.attrName, 14, Color(0xff282828), bold: true),
baseText(element.attrValue, 11, Color(0xff999999)),
],
),
),
));
if (i < data.data.length - 2) {
if (i != _model.planoverItem?.overviewAttrs.length - 1) {
list.add(Container(
width: 0.5,
height: 18,
color: Color(0xFFE5E5E5),
));
}
}
i++;
});
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
......@@ -388,15 +344,9 @@ class LevelOneState extends BaseState<LevelOnePage>
children: list,
),
);
},
);
}
Widget explain() {
return StreamBuilder<List<String>>(
stream: _model.explainLive.stream,
initialData: ["www", "www", "www", "??"],
builder: (c, data) {
List<Widget> list = [];
list.add(Container(
height: 31,
......@@ -416,19 +366,21 @@ class LevelOneState extends BaseState<LevelOnePage>
],
),
));
for (int i = 0; i < data.data.length; i += 2) {
if (_model.planoverItem != null) {
_model.planoverItem.explanationAttrs.forEach((element) {
list.add(Container(
height: 28,
child: Row(
children: <Widget>[
baseText(data.data[i], 13, Color(0xff999999)),
baseText(element.attrName, 13, Color(0xff999999)),
Container(
margin: EdgeInsets.only(left: 12),
child: baseText(data.data[i + 1], 13, Color(0xff666666)),
child: baseText(element.attrValue, 13, Color(0xff666666)),
)
],
),
));
});
}
return Container(
margin: EdgeInsets.only(left: 15, right: 15, bottom: 20),
......@@ -437,8 +389,6 @@ class LevelOneState extends BaseState<LevelOnePage>
children: list,
),
);
},
);
}
Widget feed() {
......@@ -451,65 +401,159 @@ class LevelOneState extends BaseState<LevelOnePage>
));
}
Widget pages() {
return StreamBuilder<Pair<int, List<Cards>>>(
stream: _model.cardsLive.stream,
initialData: _model.cardsLive.data ?? Pair(LOADING, null),
builder: (c, data) {
double height = MediaQuery.of(context).size.height - 86 - 55.5 - 49;
if (_model.data[_model.currentIndex] != null &&
_model.data[_model.currentIndex].length > 0) {
height = max(
_model.data[_model.currentIndex].length *
_model.pageHeightList[_model.currentIndex] *
1.0,
height);
}
return Container(
width: double.maxFinite,
height: height,
child: PageView.builder(
itemBuilder: (c, pageIndex) {
if (data.data.first == FAIL) {
return errorItem(MediaQuery.of(context).size.width, height, () {
_model.refreshView(true);
});
}
if (data.data.first == LOADING ||
_model.data[pageIndex] == null) {
return loadingItem();
}
if (data.data.second.length == 0) {
if (_model.pageList[pageIndex] == 1) {
return emptyItem(MediaQuery.of(context).size.width, height);
} else {
_refreshController.loadNoData();
}
} else {
_refreshController.loadComplete();
}
return ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemBuilder: (c, index) {
return LevelOneItem(_model.data[pageIndex][index]);
},
itemCount: _model.data[pageIndex].length,
);
},
allowImplicitScrolling: false,
dragStartBehavior: DragStartBehavior.down,
controller: pageController,
itemCount: 4,
onPageChanged: (index) {
_refreshController.resetNoData();
setState(() {
});
_model.topIndexLive.notifyView(index);
_model.selectPage(index);
},
),
);
},
);
}
// Widget home() {
// return Column(
// children: <Widget>[
// Expanded(
// child: Stack(
// children: <Widget>[
// MediaQuery.removePadding(
// removeTop: true,
// context: context,
// child: NotificationListener(
// onNotification: (scrollNotification) {
// if (scrollNotification is ScrollUpdateNotification &&
// scrollNotification.metrics.axisDirection.index == 2) {
// _onScroll(scrollNotification.metrics.pixels);
// }
// return false;
// },
// child: baseRefreshView(
// _refreshController,
// () {
// //TODO
//// _refreshController.refreshCompleted();
// },
// null,
// null,
// customScrollView: CustomScrollView(
// slivers: <Widget>[
// SliverList(
// delegate: SliverChildBuilderDelegate(
// (BuildContext context, int index) {
// return oneList[index];
// },
// childCount: oneList.length,
// ),
// ),
// ],
// ),
// pullUp: true,
// onLoading: () {
// _model.loadMore();
// },
// ),
// )),
// StreamBuilder<double>(
// stream: _model.appBarLive.stream,
// initialData: _model.appBarLive.data ?? 0.0,
// builder: (c, data) {
// return Opacity(
// opacity: data.data,
// child: Container(
// height: 86,
// decoration: BoxDecoration(color: Colors.white),
// child: Center(
// child: Padding(
// padding: EdgeInsets.only(top: 20),
// child: Text('文案'),
// ),
// ),
// ),
// );
// },
// ),
// baseSliverTitle("title", MediaQuery.of(context).size.width,
// _model.appBarLive),
// Positioned(
// top: 86,
// child: StreamBuilder<bool>(
// stream: _model.showTab.stream,
// initialData: _model.showTab.data ?? false,
// builder: (c, data) {
// return Visibility(
// visible: data.data,
// child: Container(
// width: MediaQuery.of(context).size.width,
// color: Colors.white,
// child: MessageBarView(
// topIndexLive: _model.topIndexLive,
// topScrollLive: _model.topScrollLive,
// pageController: pageController,
// ),
// ));
// },
// ),
// ),
// baseSliverBack(() {
// Navigator.of(context).pop();
// })
// ],
// ),
// ),
// Container(
// height: 0.5,
// width: double.maxFinite,
// color: Color(0xffE5E5E5),
// ),
// Container(
// width: double.maxFinite,
// height: 55,
// child: Row(
// mainAxisSize: MainAxisSize.min,
// crossAxisAlignment: CrossAxisAlignment.center,
// children: <Widget>[
// Container(
// margin: EdgeInsets.only(left: 18),
// width: 30,
// child: Column(
// mainAxisSize: MainAxisSize.min,
// children: <Widget>[
// Container(
// width: 22,
// height: 22,
// child: Image.asset("assets/vs_black.png"),
// ),
// Container(
// margin: EdgeInsets.only(top: 3),
// child: baseText("去比较", 10, Color(0xff282828)),
// )
// ],
// ),
// ),
// GestureDetector(
// behavior: HitTestBehavior.opaque,
// onTap: () {},
// child: Container(
// margin: EdgeInsets.only(left: 15),
// width: 135,
// height: 40,
// decoration: BoxDecoration(
// color: Color(0xff51CDC7),
// borderRadius: BorderRadius.circular(20)),
// alignment: Alignment.center,
// child: baseText("咨询", 14, Colors.white, bold: true),
// )),
// GestureDetector(
// behavior: HitTestBehavior.opaque,
// onTap: () {},
// child: Container(
// margin: EdgeInsets.only(left: 15),
// width: 135,
// height: 40,
// decoration: BoxDecoration(
// color: Color(0xffF96079),
// borderRadius: BorderRadius.circular(20)),
// alignment: Alignment.center,
// child: baseText("获取底价", 14, Colors.white, bold: true),
// )),
// Expanded(
// child: Container(),
// )
// ],
// ),
// )
// ],
// );
// }
}
......@@ -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