Commit a8260add authored by 杜欣's avatar 杜欣

Merge branch 'test' into featrue/duxin

# Conflicts:
#	lib/main.dart
parents 3a5d1c31 54cb8cd7
assets/left_arrow.png

776 Bytes | W: | H:

assets/left_arrow.png

992 Bytes | W: | H:

assets/left_arrow.png
assets/left_arrow.png
assets/left_arrow.png
assets/left_arrow.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -2,6 +2,7 @@
* @author lsy
* @date 2020/6/29
**/
import 'package:flutter/material.dart';
import 'package:flutter_common/commonModel/live/BaseModel.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart';
......@@ -18,27 +19,55 @@ class LevelOneModel extends BaseModel {
LiveData<bool> showTab = LiveData();
LiveData<int> topIndexLive = new LiveData();
LiveData<double> topScrollLive = new LiveData();
LiveData<bool> loadingLive = LiveData();
RxDispose rxDispose = RxDispose();
LiveData<Pair<int,List<Cards>>> cardsLive = LiveData();
LiveData<Pair<int, List<Cards>>> cardsLive = LiveData();
Map<int, List<Cards>> data = new Map();
List list = ["plan", "hospital", "doctor", "diary"];
List pageList = [1, 1, 1, 1];
List pageHeightList = [118, 149, 118, 118];
void refreshView(bool clear, {RefreshController refreshListener}) {
int index = currentIndex;
if (clear) {
data.clear();
pageList = [1, 1, 1, 1];
}
ClueApiImpl.getInstance()
.getLevelOneList(
DioUtil.getInstance().getDio(), 123, list[index], pageList[index])
.listen((event) {
}).addToDispose(rxDispose).onError((err) {
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()
// .getLevelOneList(
// DioUtil.getInstance().getDio(), 123, list[index], pageList[index])
// .listen((event) {})
// .addToDispose(rxDispose)
// .onError((err) {});
}
int currentIndex = 0;
......@@ -51,6 +80,7 @@ class LevelOneModel extends BaseModel {
rectLive.dispost();
topIndexLive.dispost();
topScrollLive.dispost();
loadingLive.dispost();
}
void selectPage(int index) {
......@@ -58,5 +88,13 @@ class LevelOneModel extends BaseModel {
return;
}
currentIndex = index;
if (data[currentIndex] == null) {
cardsLive.notifyView(Pair(LOADING, null));
refreshView(true);
} else {
cardsLive.notifyView(Pair(ENDLOADING, data[currentIndex]));
}
}
void loadMore() {}
}
......@@ -2,16 +2,22 @@
* @author lsy
* @date 2020/6/29
**/
import 'dart:math';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
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/LevelOneModel.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';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/util/DartUtil.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
......@@ -31,10 +37,15 @@ class LevelOneState extends BaseState<LevelOnePage>
GlobalKey key1 = new GlobalKey();
double screenWidth;
List<Widget> oneList = new List();
int lastPageIndex = 0;
@override
void initState() {
super.initState();
Future.delayed(Duration(seconds: 3), () {
_model.loadingLive.notifyView(false);
_model.refreshView(true);
});
pageController.addListener(() {
if (screenWidth != null) {
_model.topScrollLive.notifyView(
......@@ -54,7 +65,6 @@ class LevelOneState extends BaseState<LevelOnePage>
}
void _onScroll(double offset) {
print("OFFSET ${offset}");
if (offset < 10) {
_model.appBarLive.notifyView(0.0);
} else if (offset < 500) {
......@@ -90,7 +100,6 @@ class LevelOneState extends BaseState<LevelOnePage>
_model.dispose();
pageController.dispose();
_refreshController.dispose();
pageController.dispose();
super.dispose();
}
......@@ -99,146 +108,191 @@ class LevelOneState extends BaseState<LevelOnePage>
screenWidth = MediaQuery.of(context).size.width;
return Scaffold(
backgroundColor: Colors.white,
body: 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
body: SafeArea(
top: false,
child: StreamBuilder<bool>(
stream: _model.loadingLive.stream,
initialData: true,
builder: (c, data) {
if (data.data) {
return loadingItem();
} else {
return home();
}
},
)));
}
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,
),
),
],
)),
)),
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('文案'),
},
null,
null,
customScrollView: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return oneList[index];
},
childCount: oneList.length,
),
),
),
);
},
),
Positioned(
top: 86,
child: StreamBuilder<bool>(
stream: _model.showTab.stream,
initialData: _model.showTab.data ?? false,
builder: (c, data) {
return Opacity(
opacity: data.data ? 1.0 : 0.0,
child: Container(
width: MediaQuery.of(context).size.width,
color: Colors.white,
child: MessageBarView(
topIndexLive: _model.topIndexLive,
topScrollLive: _model.topScrollLive,
pageController: pageController,
),
));
],
),
pullUp: true,
onLoading: () {
_model.loadMore();
},
),
)
],
),
),
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"),
)),
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('文案'),
),
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: () {},
);
},
),
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,
),
));
},
),
),
Positioned(
top: 49,
left: 15,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
//TODO
print("TAP");
Navigator.pop(context);
},
child: Container(
width: 30,
height: 30,
decoration: BoxDecoration(
color: Color(0x99FFFFFF), shape: BoxShape.circle),
alignment: Alignment.center,
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(),
)
],
child: Image.asset("assets/left_arrow.png"),
),
)),
)
],
),
),
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(),
)
],
),
)
],
);
}
Widget head() {
......@@ -252,24 +306,7 @@ class LevelOneState extends BaseState<LevelOnePage>
fit: BoxFit.cover,
image: NetworkImage(
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w"))),
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
//TODO
},
child: Container(
width: 30,
height: 30,
decoration:
BoxDecoration(color: Color(0x99FFFFFF), shape: BoxShape.circle),
margin: EdgeInsets.only(top: 49, left: 15),
alignment: Alignment.center,
child: Container(
width: 7,
height: 14,
child: Image.asset("assets/left_arrow.png"),
),
)),
// child: ,
);
}
......@@ -433,41 +470,66 @@ class LevelOneState extends BaseState<LevelOnePage>
));
}
List temp = [20, 10, 10, 10];
int currentIndex;
Widget pages() {
// return StreamBuilder(
// stream: _model.cardsLive.stream,
// initialData: _model.cardsLive.data??[],
// builder: (c,data){
//
// },
// )
double height = 500;
return Container(
width: double.maxFinite,
height: height,
child: PageView.builder(
itemBuilder: (c, index) {
return Container(
width: double.maxFinite,
height: height,
color: Colors.red,
child: ListView.builder(itemBuilder: (c,index){
},itemCount: 10,),
);
},
allowImplicitScrolling: false,
dragStartBehavior: DragStartBehavior.down,
controller: pageController,
itemCount: 4,
onPageChanged: (index) {
_model.topIndexLive.notifyView(index);
_model.selectPage(index);
},
),
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(
color: Colors.yellow,
width: double.maxFinite,
height: height,
child: PageView.builder(
itemBuilder: (c, pageIndex) {
if (data.data.first == FAIL) {
return errorItem(() {
_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();
} 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) {
setState(() {
_refreshController.resetNoData();
});
_model.topIndexLive.notifyView(index);
_model.selectPage(index);
},
),
);
},
);
}
}
......@@ -10,4 +10,6 @@ import 'MainRouterImpl.dart';
@Router("MainRouter", MainRouterImpl, true)
abstract class MainRouter extends RouterBaser {
void init();
Widget getTestPage();
}
......@@ -4,6 +4,7 @@
**/
import 'package:flutter/src/widgets/framework.dart';
import 'package:gm_flutter/MainRouter/manager/MainManager.dart';
import 'package:gm_flutter/MainRouter/page/test/TestPage.dart';
import 'MainRouter.dart';
......@@ -12,4 +13,9 @@ class MainRouterImpl implements MainRouter {
void init() {
MainManager.getInstance().startInit();
}
@override
Widget getTestPage() {
return TestPage();
}
}
......@@ -8,6 +8,7 @@ import 'package:flutter_common/commonModel/util/JumpUtil.dart';
import 'package:gm_flutter/MainRouter/page/proxy/NetProxyPage.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.dart';
import 'package:gm_flutter/main.mark.dart';
import 'TP.dart';
......@@ -24,8 +25,8 @@ class TestState extends BaseState<TestPage> {
list.add(listItem("设置代理页面", () {
JumpUtil.jumpToPageRight(context, NetProxyPage());
}));
list.add(listItem("测试测试", () {
JumpUtil.jumpToPageRight(context, TP());
list.add(listItem("一级列表页", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getLevelOnePage());
}));
return list;
}
......@@ -40,7 +41,7 @@ class TestState extends BaseState<TestPage> {
Navigator.pop(context);
}),
body: Container(
child: Column(
child: ListView(
children: innerList(),
),
),
......
......@@ -70,7 +70,7 @@ AppBar _baseAppBarChangeTitle(
width: 30,
height: 30,
child: Image.asset(
"images/left_arrow.png",
"assets/left_arrow.png",
color: Color(0xff323232),
),
))),
......@@ -272,16 +272,17 @@ Widget baseRefreshView(RefreshController refreshController,
footer: CustomFooter(
builder: (BuildContext context, LoadStatus mode) {
Widget body;
// if (mode == LoadStatus.idle) {
// body = baseText("准备加载", 12, Color(0xff545454));
// } else
if (mode == LoadStatus.loading) {
print("LOAD STATUE ${mode}");
if (mode == LoadStatus.idle) {
body = baseText("上拉加载更多", 12, Color(0xff545454));
} else if (mode == LoadStatus.loading) {
body = baseText("加载中", 12, Color(0xff545454));
} else if (mode == LoadStatus.failed) {
body = baseText("加载失败", 12, Color(0xff545454));
} else if (mode == LoadStatus.noMore) {
body = baseText("没有更多数据了", 12, Color(0xff545454));
} else {
}
else {
body = Container();
}
return Container(
......@@ -333,3 +334,23 @@ Widget normalRefreshHeader() {
},
);
}
Widget emptyItem({String detail}) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 210,
width: 210,
color: Colors.red,
),
Container(
margin: EdgeInsets.only(top: 8),
child: baseText(
detail == null ? "暂无消息,找人聊聊去" : detail, 15, Color(0xff9B9B9B)),
),
],
);
}
......@@ -69,9 +69,19 @@ class MyApp extends State<MyAppWidget> {
Widget build(BuildContext context) {
WindowUtil.setBarStatus(true);
return MaterialApp(
theme: ThemeData(),
theme: ThemeData(
primaryColor: Colors.white,
cursorColor: Color(0xff20BDBB),
canvasColor: Colors.white),
builder: FlutterBoost.init(postPush: _onRoutePushed),
home: RouterCenterImpl().findClueRouter().getLevelTwoPage());
home: isDebug
? RouterCenterImpl().findMainRouter().getTestPage()
: Container(
color: Colors.white,
child: Center(
child: loadingItem(),
),
));
}
void _onRoutePushed(
......
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