Commit 4b0b3360 authored by 朱翠翠's avatar 朱翠翠

Merge branch 'test' of http://git.wanmeizhensuo.com/linshengyu/gm_flutter into zcc/flutter

 Conflicts:
	lib/ClueModel/ClueRouter.dart
	lib/ClueModel/ClueRouterImpl.dart
	lib/ClueModel/server/api/ClueApi.dart
	lib/ClueModel/server/api/ClueApi.serv.dart
	lib/main.dart
parents f4082c9c 54cb8cd7
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* @date 2020/6/24 * @date 2020/6/24
**/ **/
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_common/Annotations/RouterBaser.dart'; import 'package:flutter_common/Annotations/RouterBaser.dart';
import 'package:flutter_common/Annotations/anno/Router.dart'; import 'package:flutter_common/Annotations/anno/Router.dart';
import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart'; import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart';
...@@ -10,4 +11,8 @@ import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart'; ...@@ -10,4 +11,8 @@ import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart';
@Router("ClueRouter", ClueRouterImpl, true) @Router("ClueRouter", ClueRouterImpl, true)
abstract class ClueRouter implements RouterBaser { abstract class ClueRouter implements RouterBaser {
Widget getProjectDetailsPage(); Widget getProjectDetailsPage();
@Router("ClueRouter",ClueRouterImpl,true)
abstract class ClueRouter implements RouterBaser{
Widget getLevelOnePage();
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/src/widgets/framework.dart';
import 'package:gm_flutter/ClueModel/ClueRouter.dart'; import 'package:gm_flutter/ClueModel/ClueRouter.dart';
import 'package:gm_flutter/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart'; import 'package:gm_flutter/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOnePage.dart';
class ClueRouterImpl implements ClueRouter { class ClueRouterImpl implements ClueRouter {
@override @override
...@@ -12,3 +13,9 @@ class ClueRouterImpl implements ClueRouter { ...@@ -12,3 +13,9 @@ class ClueRouterImpl implements ClueRouter {
return ProjectDetailsPage(); return ProjectDetailsPage();
} }
} }
class ClueRouterImpl implements ClueRouter {
@override
Widget getLevelOnePage() {
return LevelOnePage();
}
}
/*
* @author lsy
* @date 2020-01-02
**/
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_common/flutter_common.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
class MessageBarView extends StatelessWidget {
final LiveData<int> topIndexLive;
final LiveData<double> topScrollLive;
final PageController pageController;
bool leftShow = false;
bool rightShow = false;
MessageBarView({
this.topIndexLive,
this.topScrollLive,
this.pageController,
}) {}
@override
Widget build(BuildContext context) {
return topView(context);
}
Widget topViewItem(String text, int index) {
return StreamBuilder(
stream: topIndexLive.stream,
initialData: topIndexLive.data ?? 0.0,
builder: (con, data) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
// pageController.jumpToPage(index);
pageController.animateToPage(index,
duration: Duration(milliseconds: 200), curve: Curves.ease);
},
child: Container(
alignment: Alignment.bottomCenter,
width: double.maxFinite,
height: double.maxFinite,
child: baseText(text, 16,
data.data == index ? Color(0xff282828) : Color(0xffB5B5B5)),
),
);
},
);
}
Widget topView(BuildContext context) {
return Container(
height: 49,
width: double.maxFinite,
child: Column(
children: <Widget>[
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(child: topViewItem("价格", 0)),
Expanded(child: topViewItem("医院", 1)),
Expanded(child: topViewItem("医生", 2)),
Expanded(child: topViewItem("评价", 3)),
],
),
),
Container(
alignment: Alignment.topLeft,
height: 8,
margin: EdgeInsets.only(top: 4, bottom: 5),
width: double.maxFinite,
child: StreamBuilder(
stream: topScrollLive.stream,
initialData: topScrollLive.data ?? 0.0,
builder: (con, data) {
return Container(
margin: EdgeInsets.only(
left: MediaQuery.of(context).size.width / 12 +
4.5 +
data.data),
width: 22,
height: 3,
decoration: BoxDecoration(
borderRadius: new BorderRadius.circular((1.5)),
color: Color(0xff3FB5AF),
),
);
},
),
)
],
),
);
}
}
/*
* @author lsy
* @date 2020/6/29
**/
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/view/FiveStarView.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseUtil.dart';
class LevelOneItem extends StatelessWidget {
final Cards cards;
VoidCallback lowPrice;
VoidCallback ask;
LevelOneItem(this.cards, {this.lowPrice, this.ask});
@override
Widget build(BuildContext context) {
if (cards.cardType == "plan") {
return PlanItem(context);
} else if (cards.cardType == "hospital") {
return HospitalItem(context);
}
}
Widget DoctorItem(BuildContext context) {
if (cards.doctor == null && isDebug) {
throw new Exception();
}
return GestureDetector(
child: Container(
margin: EdgeInsets.only(left: 15, right: 15),
height: 127,
child: Stack(
children: <Widget>[
Positioned(
top: 15,
child: Container(
width: 45,
height: 45,
child: ClipOval(
child: CachedNetworkImage(
imageUrl: cards.doctor.portrait,
),
),
),
),
Positioned(
left: 57,
top: 18,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
baseText(cards.doctor.name, 15, Color(0xff333333),
bold: true),
Container(
margin: EdgeInsets.only(left: 4),
child: baseText(cards.doctor.name, 15, Color(0xff333333),
bold: true),
)
],
),
),
Positioned(
top: 42,
right: 0,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText("${cards.doctor.minPrice}-${cards.doctor.maxPrice}",
15, Color(0xffFF5963)),
],
),
),
Positioned(
bottom: 15,
right: 0,
child: lowPriceWidget(),
),
Positioned(
bottom: 15,
right: 187,
child: askWidget(),
),
Positioned(
left: 4.5,
bottom: 25,
child: compareWidget(),
),
],
),
),
);
}
Widget HospitalItem(BuildContext context) {
if (cards.hospital == null && isDebug) {
throw new Exception();
}
return GestureDetector(
onTap: () {},
child: Container(
margin: EdgeInsets.only(left: 15, right: 15),
height: 149,
child: Stack(
children: <Widget>[
Positioned(
left: 0,
top: 15,
child: Container(
width: 45,
height: 45,
child: ClipOval(
child: CachedNetworkImage(
imageUrl: cards.hospital.portrait,
),
),
),
),
Positioned(
left: 57,
top: 17.5,
child: baseText(cards.hospital.name, 15, Color(0xff333333),
bold: true),
),
Positioned(
top: 42.5,
right: 0,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText(
"${cards.hospital.minPrice}-${cards.hospital.maxPrice}",
15,
Color(0xffFF5963)),
],
),
),
Positioned(
bottom: 15,
right: 0,
child: lowPriceWidget(),
),
Positioned(
bottom: 15,
right: 187,
child: askWidget(),
),
Positioned(
left: 4.5,
bottom: 25,
child: compareWidget(),
),
Positioned(
bottom: 67,
left: 57,
child: baseText(cards.hospital.address, 12, Color(0xff666666)),
),
Positioned(
left: 57,
top: 43.5,
child: FiveStarView(cards.hospital.star, 5),
)
],
),
));
}
Widget PlanItem(BuildContext context) {
if (cards.plan == null && isDebug) {
throw new Exception();
}
return Container(
height: 118,
margin: EdgeInsets.only(left: 15, right: 15),
child: Stack(
children: <Widget>[
Positioned(
left: 0,
top: 15,
child: baseText(cards.plan.planName, 15, Color(0xff282828),
bold: true),
),
Positioned(
right: 0,
top: 15,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText(cards.plan.maxPrice, 15, Color(0xffFF5963))
],
),
),
Positioned(
left: 4.5,
bottom: 25,
child: compareWidget(),
),
Positioned(bottom: 15, right: 0, child: lowPriceWidget()),
Positioned(
right: 152,
bottom: 15,
child: askWidget(),
),
Positioned(
top: 40,
right: 0,
child: baseText(
"指导价:¥${cards.plan.minPrice}-${cards.plan.maxPrice}",
11,
Color(0xff666666)),
),
Positioned(
left: 15,
bottom: 0,
child: Container(
width: MediaQuery.of(context).size.width - 30,
height: 0.5,
color: Color(0xffE5E5E5),
),
)
],
),
);
}
Widget lowPriceWidget() {
return GestureDetector(
onTap: lowPrice,
behavior: HitTestBehavior.opaque,
child: Container(
width: 122,
height: 37,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(18.5),
color: Color(0xffFFF5F5)),
alignment: Alignment.center,
child: baseText("获取底价", 14, Color(0xffFF5963), bold: true),
),
);
}
Widget askWidget() {
return GestureDetector(
onTap: ask,
behavior: HitTestBehavior.opaque,
child: Container(
width: 122,
height: 37,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(18.5),
color: Color(0xffEEFDFD)),
alignment: Alignment.center,
child: baseText("咨询", 14, Color(0xff3FB5AF), bold: true),
),
);
}
Widget compareWidget() {
return Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: 18,
height: 18,
child: Image.asset("assets/vs.png"),
),
Container(
margin: EdgeInsets.only(left: 1.5),
child: baseText("去比较", 13, Color(0xff282828), bold: true),
)
],
);
}
}
/*
* @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';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
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();
RxDispose rxDispose = RxDispose();
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}) {
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;
@override
void dispose() {
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]));
}
}
void loadMore() {}
}
...@@ -2,16 +2,534 @@ ...@@ -2,16 +2,534 @@
* @author lsy * @author lsy
* @date 2020/6/29 * @date 2020/6/29
**/ **/
import 'dart:math';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.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/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';
import 'LevelOneBar.dart';
class LevelOnePage extends StatefulWidget { class LevelOnePage extends StatefulWidget {
@override @override
State<StatefulWidget> createState() => LevelOneState(); State<StatefulWidget> createState() => LevelOneState();
} }
class LevelOneState extends BaseState<LevelOnePage> { class LevelOneState extends BaseState<LevelOnePage>
with TickerProviderStateMixin {
LevelOneModel _model = new LevelOneModel();
RefreshController _refreshController = RefreshController();
PageController pageController = new PageController();
GlobalKey keyTop = new GlobalKey();
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(
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());
}
void _onScroll(double offset) {
if (offset < 10) {
_model.appBarLive.notifyView(0.0);
} else if (offset < 500) {
var topPos = PosUtil.findPos(keyTop);
if (topPos != null && topPos.dy < 0) {
double dy = -topPos.dy;
if (dy < 20) {
dy = 0;
}
double alpha = dy / 112;
if (alpha < 0) {
alpha = 0;
} else if (alpha > 1) {
alpha = 1;
}
_model.appBarLive.notifyView(alpha);
}
}
if (offset > 100) {
var key1Pos = PosUtil.findPos(key1);
if (key1Pos != null) {
if (key1Pos.dy < 86) {
_model.showTab.notifyView(true);
} else {
_model.showTab.notifyView(false);
}
}
}
}
@override
void dispose() {
_model.dispose();
pageController.dispose();
_refreshController.dispose();
super.dispose();
}
@override @override
Widget buildItem(BuildContext context) { Widget buildItem(BuildContext context) {
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();
}
},
)));
}
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('文案'),
),
),
),
);
},
),
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(
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() {
return Container(
key: keyTop,
width: double.maxFinite,
height: 200,
alignment: Alignment.topLeft,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w"))),
// child: ,
);
}
Widget good() {
return Container(
width: double.maxFinite,
height: 54,
margin: EdgeInsets.only(top: 18, bottom: 12),
child: Stack(
children: <Widget>[
Positioned(
top: 6,
left: 15,
child: baseText("TODO", 18, Color(0xff282828), bold: true),
),
Positioned(
bottom: 8,
left: 15,
child: baseText("TODO", 12, Color(0xff999999)),
),
Positioned(
right: 0,
child: Container(
width: 100,
height: 54,
decoration: BoxDecoration(
gradient: LinearGradient(colors: [
Color(0xFFFFF0F5),
Color(0xffFFF8FA),
Color(0xFFFFFFFF)
], begin: FractionalOffset(1, 0), end: FractionalOffset(0, 1))),
),
),
Positioned(
right: 15,
top: 6,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
baseText("好评率", 11, Color(0xff282828)),
Container(
margin: EdgeInsets.only(left: 4),
child: baseText("99", 20, Color(0xffFF5963)),
),
baseText("%", 11, Color(0xffFF5963)),
],
),
),
Positioned(
right: 15,
bottom: 8,
child: baseText("销量110", 11, Color(0xff666666)),
)
],
),
);
}
Widget rect() {
return StreamBuilder<List<String>>(
stream: _model.rectLive.stream,
initialData: ["w", "w", "q", "w"],
builder: (c, data) {
List<Widget> list = List();
for (int i = 0; i < data.data.length; i += 2) {
list.add(Expanded(
child: Container(
alignment: Alignment.center,
child: Column(
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)),
],
),
),
));
if (i < data.data.length - 2) {
list.add(Container(
width: 0.5,
height: 18,
color: Color(0xFFE5E5E5),
));
}
}
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Color(0xffF9F8FB),
),
width: double.maxFinite,
height: 62,
margin: EdgeInsets.only(left: 15, right: 15, bottom: 20),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
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,
child: Row(
children: <Widget>[
baseText("项目说明", 15, Color(0xff282828)),
Expanded(
child: Container(),
),
GestureDetector(
onTap: () {
//TODO
},
behavior: HitTestBehavior.opaque,
child: baseText("了解更多", 12, Color(0xff3FB5AF)),
)
],
),
));
for (int i = 0; i < data.data.length; i += 2) {
list.add(Container(
height: 28,
child: Row(
children: <Widget>[
baseText(data.data[i], 13, Color(0xff999999)),
Container(
margin: EdgeInsets.only(left: 12),
child: baseText(data.data[i + 1], 13, Color(0xff666666)),
)
],
),
));
}
return Container(
margin: EdgeInsets.only(left: 15, right: 15, bottom: 20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: list,
),
);
},
);
}
Widget feed() {
return Container(
key: key1,
child: MessageBarView(
topIndexLive: _model.topIndexLive,
topScrollLive: _model.topScrollLive,
pageController: pageController,
));
}
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(
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);
},
),
);
},
);
} }
} }
...@@ -6,9 +6,14 @@ import 'package:flutter_common/Annotations/anno/Get.dart'; ...@@ -6,9 +6,14 @@ import 'package:flutter_common/Annotations/anno/Get.dart';
import 'package:flutter_common/Annotations/anno/Query.dart'; import 'package:flutter_common/Annotations/anno/Query.dart';
import 'package:flutter_common/Annotations/anno/ServiceCenter.dart'; import 'package:flutter_common/Annotations/anno/ServiceCenter.dart';
import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart'; import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
@ServiceCenter() @ServiceCenter()
abstract class ClueApi { abstract class ClueApi {
@Get("/api/janus/plans/<:plan_id>/detail") @Get("/api/janus/plans/<:plan_id>/detail")
ProjectDetailsItem getProjectDetails(@Query("plan_id") int plan_id); ProjectDetailsItem getProjectDetails(@Query("plan_id") int plan_id);
abstract class ClueApi {
@Get("api/janus/plans/plan_feed")
LevelOneFeedList getLevelOneList(@Query("plan_id") int plan_id,
@Query("tab_type") String tab_type, @Query("page") int page);
} }
...@@ -16,6 +16,8 @@ import 'package:flutter/foundation.dart'; ...@@ -16,6 +16,8 @@ import 'package:flutter/foundation.dart';
import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart'; import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
const bool inProduction = const bool.fromEnvironment("dart.vm.product"); const bool inProduction = const bool.fromEnvironment("dart.vm.product");
class ClueApiImpl { class ClueApiImpl {
...@@ -47,6 +49,23 @@ class ClueApiImpl { ...@@ -47,6 +49,23 @@ class ClueApiImpl {
}); });
} }
Stream<LevelOneFeedList> getLevelOneList(
Dio _dio, int plan_id, String tab_type, int page) {
return Stream.fromFuture(get(_dio, 'api/janus/plans/plan_feed', data: {
'plan_id': plan_id,
'tab_type': tab_type,
'page': page,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parseLevelOneFeedList, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
///==================base method================== ///==================base method==================
Future<Response> get(Dio _dio, url, {data, options, cancelToken}) async { Future<Response> get(Dio _dio, url, {data, options, cancelToken}) async {
...@@ -184,6 +203,10 @@ class ClueApiImpl { ...@@ -184,6 +203,10 @@ class ClueApiImpl {
} }
} }
LevelOneFeedList parseLevelOneFeedList(String value) {
return LevelOneFeedList.fromJson(json.decode(value));
}
ProjectDetailsItem parseProjectDetailsItem(String value) { ProjectDetailsItem parseProjectDetailsItem(String value) {
return ProjectDetailsItem.fromJson(json.decode(value)); return ProjectDetailsItem.fromJson(json.decode(value));
} }
/*
* @author lsy
* @date 2020/6/29
**/
class LevelOneFeedList {
List<Cards> cards;
LevelOneFeedList({this.cards});
LevelOneFeedList.fromJson(Map<String, dynamic> json) {
if (json['cards'] != null) {
cards = new List<Cards>();
json['cards'].forEach((v) {
cards.add(new Cards.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.cards != null) {
data['cards'] = this.cards.map((v) => v.toJson()).toList();
}
return data;
}
}
class Cards {
String cardType;
Plan plan;
Hospital hospital;
Hospital doctor;
Diary diary;
Cards({this.cardType, this.plan, this.hospital, this.doctor, this.diary});
Cards.fromJson(Map<String, dynamic> json) {
cardType = json['card_type'];
plan = json['plan'] != null ? new Plan.fromJson(json['plan']) : null;
hospital = json['hospital'] != null
? new Hospital.fromJson(json['hospital'])
: null;
doctor =
json['doctor'] != null ? new Hospital.fromJson(json['doctor']) : null;
diary = json['diary'] != null ? new Diary.fromJson(json['diary']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['card_type'] = this.cardType;
if (this.plan != null) {
data['plan'] = this.plan.toJson();
}
if (this.hospital != null) {
data['hospital'] = this.hospital.toJson();
}
if (this.doctor != null) {
data['doctor'] = this.doctor.toJson();
}
if (this.diary != null) {
data['diary'] = this.diary.toJson();
}
return data;
}
}
class Plan {
String planName;
String minPrice;
String maxPrice;
String positiveRate;
String salesCount;
List<BaseAttrs> baseAttrs;
String projectImage;
String consultUrl;
String phoneAuthroize;
Plan(
{this.planName,
this.minPrice,
this.maxPrice,
this.positiveRate,
this.salesCount,
this.baseAttrs,
this.projectImage,
this.consultUrl,
this.phoneAuthroize});
Plan.fromJson(Map<String, dynamic> json) {
planName = json['plan_name'];
minPrice = json['min_price'];
maxPrice = json['max_price'];
positiveRate = json['positive_rate'];
salesCount = json['sales_count'];
if (json['base_attrs'] != null) {
baseAttrs = new List<BaseAttrs>();
json['base_attrs'].forEach((v) {
baseAttrs.add(new BaseAttrs.fromJson(v));
});
}
projectImage = json['project_image'];
consultUrl = json['consult_url'];
phoneAuthroize = json['phone_authroize'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['plan_name'] = this.planName;
data['min_price'] = this.minPrice;
data['max_price'] = this.maxPrice;
data['positive_rate'] = this.positiveRate;
data['sales_count'] = this.salesCount;
if (this.baseAttrs != null) {
data['base_attrs'] = this.baseAttrs.map((v) => v.toJson()).toList();
}
data['project_image'] = this.projectImage;
data['consult_url'] = this.consultUrl;
data['phone_authroize'] = this.phoneAuthroize;
return data;
}
}
class BaseAttrs {
String attrName;
String attrValue;
BaseAttrs({this.attrName, this.attrValue});
BaseAttrs.fromJson(Map<String, dynamic> json) {
attrName = json['attr_name'];
attrValue = json['attr_value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['attr_name'] = this.attrName;
data['attr_value'] = this.attrValue;
return data;
}
}
class Hospital {
String portrait;
String name;
String minPrice;
String maxPrice;
String address;
int star;
List<BaseAttrs> baseAttrs;
String consultUrl;
String phoneAuthroize;
Hospital(
{this.portrait,
this.name,
this.minPrice,
this.maxPrice,
this.baseAttrs,
this.consultUrl,
this.phoneAuthroize});
Hospital.fromJson(Map<String, dynamic> json) {
portrait = json['portrait'];
name = json['name'];
star = json['star'];
address = json['address'];
minPrice = json['min_price'];
maxPrice = json['max_price'];
if (json['base_attrs'] != null) {
baseAttrs = new List<BaseAttrs>();
json['base_attrs'].forEach((v) {
baseAttrs.add(new BaseAttrs.fromJson(v));
});
}
consultUrl = json['consult_url'];
phoneAuthroize = json['phone_authroize'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['portrait'] = this.portrait;
data['name'] = this.name;
data['min_price'] = this.minPrice;
data['max_price'] = this.maxPrice;
data['address'] = this.address;
data['star'] = this.star;
if (this.baseAttrs != null) {
data['base_attrs'] = this.baseAttrs.map((v) => v.toJson()).toList();
}
data['consult_url'] = this.consultUrl;
data['phone_authroize'] = this.phoneAuthroize;
return data;
}
}
class Diary {
int diaryNum;
String videoUrl;
bool isIdentification;
bool isLiked;
String titleStyleType;
int replyNum;
int lasestTopicCreatedTime;
List<Images> images;
RelationServiceSku relationServiceSku;
String createdTime;
int latestTopicId;
int id;
String city;
int userId;
String title;
bool isVoted;
int diaryId;
List<String> preImageList;
int voteNum;
List<TagsNewEra> tagsNewEra;
String content;
String videoPic;
String shortVideoUrl;
int diaryAmount;
String diaryTitle;
String authorType;
List<Tags> tags;
String contentLevel;
int lastModified;
User user;
bool isOnline;
String date;
String membershipLevel;
String viewNum;
List<String> postImageList;
UserLevel userLevel;
int serviceId;
Diary(
{this.diaryNum,
this.videoUrl,
this.isIdentification,
this.isLiked,
this.titleStyleType,
this.replyNum,
this.lasestTopicCreatedTime,
this.images,
this.relationServiceSku,
this.createdTime,
this.latestTopicId,
this.id,
this.city,
this.userId,
this.title,
this.isVoted,
this.diaryId,
this.preImageList,
this.voteNum,
this.tagsNewEra,
this.content,
this.videoPic,
this.shortVideoUrl,
this.diaryAmount,
this.diaryTitle,
this.authorType,
this.tags,
this.contentLevel,
this.lastModified,
this.user,
this.isOnline,
this.date,
this.membershipLevel,
this.viewNum,
this.postImageList,
this.userLevel,
this.serviceId});
Diary.fromJson(Map<String, dynamic> json) {
diaryNum = json['diary_num'];
videoUrl = json['video_url'];
isIdentification = json['is_identification'];
isLiked = json['is_liked'];
titleStyleType = json['title_style_type'];
replyNum = json['reply_num'];
lasestTopicCreatedTime = json['lasest_topic_created_time'];
if (json['images'] != null) {
images = new List<Images>();
json['images'].forEach((v) {
images.add(new Images.fromJson(v));
});
}
relationServiceSku = json['relation_service_sku'] != null
? new RelationServiceSku.fromJson(json['relation_service_sku'])
: null;
createdTime = json['created_time'];
latestTopicId = json['latest_topic_id'];
id = json['id'];
city = json['city'];
userId = json['user_id'];
title = json['title'];
isVoted = json['is_voted'];
diaryId = json['diary_id'];
preImageList = json['pre_image_list'].cast<String>();
voteNum = json['vote_num'];
if (json['tags_new_era'] != null) {
tagsNewEra = new List<TagsNewEra>();
json['tags_new_era'].forEach((v) {
tagsNewEra.add(new TagsNewEra.fromJson(v));
});
}
content = json['content'];
videoPic = json['video_pic'];
shortVideoUrl = json['short_video_url'];
diaryAmount = json['diary_amount'];
diaryTitle = json['diary_title'];
authorType = json['author_type'];
if (json['tags'] != null) {
tags = new List<Tags>();
json['tags'].forEach((v) {
tags.add(new Tags.fromJson(v));
});
}
contentLevel = json['content_level'];
lastModified = json['last_modified'];
user = json['user'] != null ? new User.fromJson(json['user']) : null;
isOnline = json['is_online'];
date = json['date'];
membershipLevel = json['membership_level'];
viewNum = json['view_num'];
postImageList = json['post_image_list'].cast<String>();
userLevel = json['user_level'] != null
? new UserLevel.fromJson(json['user_level'])
: null;
serviceId = json['service_id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['diary_num'] = this.diaryNum;
data['video_url'] = this.videoUrl;
data['is_identification'] = this.isIdentification;
data['is_liked'] = this.isLiked;
data['title_style_type'] = this.titleStyleType;
data['reply_num'] = this.replyNum;
data['lasest_topic_created_time'] = this.lasestTopicCreatedTime;
if (this.images != null) {
data['images'] = this.images.map((v) => v.toJson()).toList();
}
if (this.relationServiceSku != null) {
data['relation_service_sku'] = this.relationServiceSku.toJson();
}
data['created_time'] = this.createdTime;
data['latest_topic_id'] = this.latestTopicId;
data['id'] = this.id;
data['city'] = this.city;
data['user_id'] = this.userId;
data['title'] = this.title;
data['is_voted'] = this.isVoted;
data['diary_id'] = this.diaryId;
data['pre_image_list'] = this.preImageList;
data['vote_num'] = this.voteNum;
if (this.tagsNewEra != null) {
data['tags_new_era'] = this.tagsNewEra.map((v) => v.toJson()).toList();
}
data['content'] = this.content;
data['video_pic'] = this.videoPic;
data['short_video_url'] = this.shortVideoUrl;
data['diary_amount'] = this.diaryAmount;
data['diary_title'] = this.diaryTitle;
data['author_type'] = this.authorType;
if (this.tags != null) {
data['tags'] = this.tags.map((v) => v.toJson()).toList();
}
data['content_level'] = this.contentLevel;
data['last_modified'] = this.lastModified;
if (this.user != null) {
data['user'] = this.user.toJson();
}
data['is_online'] = this.isOnline;
data['date'] = this.date;
data['membership_level'] = this.membershipLevel;
data['view_num'] = this.viewNum;
data['post_image_list'] = this.postImageList;
if (this.userLevel != null) {
data['user_level'] = this.userLevel.toJson();
}
data['service_id'] = this.serviceId;
return data;
}
}
class Images {
String imageWide;
int imageType;
String image;
String sImagePlatform;
String imageSlimwidth;
String smallWide;
String imageThumb;
String imageHalf;
String desc;
Images(
{this.imageWide,
this.imageType,
this.image,
this.sImagePlatform,
this.imageSlimwidth,
this.smallWide,
this.imageThumb,
this.imageHalf,
this.desc});
Images.fromJson(Map<String, dynamic> json) {
imageWide = json['image_wide'];
imageType = json['image_type'];
image = json['image'];
sImagePlatform = json['_image_platform'];
imageSlimwidth = json['image_slimwidth'];
smallWide = json['small_wide'];
imageThumb = json['image_thumb'];
imageHalf = json['image_half'];
desc = json['desc'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['image_wide'] = this.imageWide;
data['image_type'] = this.imageType;
data['image'] = this.image;
data['_image_platform'] = this.sImagePlatform;
data['image_slimwidth'] = this.imageSlimwidth;
data['small_wide'] = this.smallWide;
data['image_thumb'] = this.imageThumb;
data['image_half'] = this.imageHalf;
data['desc'] = this.desc;
return data;
}
}
class RelationServiceSku {
RelationServiceSku();
RelationServiceSku.fromJson(Map<String, dynamic> json) {}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
return data;
}
}
class TagsNewEra {
String type;
String name;
int tagId;
int id;
TagsNewEra({this.type, this.name, this.tagId, this.id});
TagsNewEra.fromJson(Map<String, dynamic> json) {
type = json['type'];
name = json['name'];
tagId = json['tag_id'];
id = json['id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type'] = this.type;
data['name'] = this.name;
data['tag_id'] = this.tagId;
data['id'] = this.id;
return data;
}
}
class User {
Null city;
int userId;
int topicNumPosted;
int voteNumGained;
String portrait;
String userName;
String membershipLevel;
User(
{this.city,
this.userId,
this.topicNumPosted,
this.voteNumGained,
this.portrait,
this.userName,
this.membershipLevel});
User.fromJson(Map<String, dynamic> json) {
city = json['city'];
userId = json['user_id'];
topicNumPosted = json['topic_num_posted'];
voteNumGained = json['vote_num_gained'];
portrait = json['portrait'];
userName = json['user_name'];
membershipLevel = json['membership_level'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['city'] = this.city;
data['user_id'] = this.userId;
data['topic_num_posted'] = this.topicNumPosted;
data['vote_num_gained'] = this.voteNumGained;
data['portrait'] = this.portrait;
data['user_name'] = this.userName;
data['membership_level'] = this.membershipLevel;
return data;
}
}
class UserLevel {
String levelIcon;
String constellationIcon;
String membershipIcon;
UserLevel({this.levelIcon, this.constellationIcon, this.membershipIcon});
UserLevel.fromJson(Map<String, dynamic> json) {
levelIcon = json['level_icon'];
constellationIcon = json['constellation_icon'];
membershipIcon = json['membership_icon'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['level_icon'] = this.levelIcon;
data['constellation_icon'] = this.constellationIcon;
data['membership_icon'] = this.membershipIcon;
return data;
}
}
class Tags {
String type;
String name;
int tagId;
int id;
Tags({this.type, this.name, this.tagId, this.id});
Tags.fromJson(Map<String, dynamic> json) {
type = json['type'];
name = json['name'];
tagId = json['tag_id'];
id = json['id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type'] = this.type;
data['name'] = this.name;
data['tag_id'] = this.tagId;
data['id'] = this.id;
return data;
}
}
/*
* @author lsy
* @date 2020/6/30
**/
import 'package:flutter/cupertino.dart';
class PosUtil {
static Offset findPos(GlobalKey globalKey) {
Offset offset;
if (globalKey.currentContext != null) {
RenderBox box = globalKey.currentContext.findRenderObject();
offset = box.localToGlobal(Offset.zero);
}
return offset;
}
}
/*
* @author lsy
* @date 2020/6/29
**/
import 'package:flutter/cupertino.dart';
class FiveStarView extends StatelessWidget {
final int allStarCount;
final int lightStarCount;
FiveStarView(this.lightStarCount, this.allStarCount);
@override
Widget build(BuildContext context) {
List<Widget> list = new List();
for (int i = 0; i < allStarCount; i++) {
if (i <= lightStarCount) {
list.add(Container(
height: 13,
width: 13,
child: Image.asset("assets/sel_star.png"),
));
if (i != 0 && i != allStarCount - 1) {
list.add(Container(
height: 1,
width: 2,
));
}
} else {
list.add(Container(
height: 13,
width: 13,
child: Image.asset("assets/normal_star.png"),
));
if (i != 0 && i != allStarCount - 1) {
list.add(Container(
height: 1,
width: 2,
));
}
}
}
return Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: list,
);
}
}
...@@ -10,4 +10,6 @@ import 'MainRouterImpl.dart'; ...@@ -10,4 +10,6 @@ import 'MainRouterImpl.dart';
@Router("MainRouter", MainRouterImpl, true) @Router("MainRouter", MainRouterImpl, true)
abstract class MainRouter extends RouterBaser { abstract class MainRouter extends RouterBaser {
void init(); void init();
Widget getTestPage();
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
**/ **/
import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/src/widgets/framework.dart';
import 'package:gm_flutter/MainRouter/manager/MainManager.dart'; import 'package:gm_flutter/MainRouter/manager/MainManager.dart';
import 'package:gm_flutter/MainRouter/page/test/TestPage.dart';
import 'MainRouter.dart'; import 'MainRouter.dart';
...@@ -12,4 +13,9 @@ class MainRouterImpl implements MainRouter { ...@@ -12,4 +13,9 @@ class MainRouterImpl implements MainRouter {
void init() { void init() {
MainManager.getInstance().startInit(); MainManager.getInstance().startInit();
} }
@override
Widget getTestPage() {
return TestPage();
}
} }
...@@ -8,6 +8,7 @@ import 'package:flutter_common/commonModel/util/JumpUtil.dart'; ...@@ -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/MainRouter/page/proxy/NetProxyPage.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart'; import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.dart'; import 'package:gm_flutter/commonModel/base/BaseState.dart';
import 'package:gm_flutter/main.mark.dart';
import 'TP.dart'; import 'TP.dart';
...@@ -24,8 +25,8 @@ class TestState extends BaseState<TestPage> { ...@@ -24,8 +25,8 @@ class TestState extends BaseState<TestPage> {
list.add(listItem("设置代理页面", () { list.add(listItem("设置代理页面", () {
JumpUtil.jumpToPageRight(context, NetProxyPage()); JumpUtil.jumpToPageRight(context, NetProxyPage());
})); }));
list.add(listItem("测试测试", () { list.add(listItem("一级列表页", () {
JumpUtil.jumpToPageRight(context, TP()); JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getLevelOnePage());
})); }));
return list; return list;
} }
...@@ -40,7 +41,7 @@ class TestState extends BaseState<TestPage> { ...@@ -40,7 +41,7 @@ class TestState extends BaseState<TestPage> {
Navigator.pop(context); Navigator.pop(context);
}), }),
body: Container( body: Container(
child: Column( child: ListView(
children: innerList(), children: innerList(),
), ),
), ),
......
...@@ -9,4 +9,3 @@ export 'base/BaseUtil.dart'; ...@@ -9,4 +9,3 @@ export 'base/BaseUtil.dart';
export 'net/Api.dart'; export 'net/Api.dart';
export 'net/DioUtil.dart'; export 'net/DioUtil.dart';
export 'picker/loadingPicker.dart'; export 'picker/loadingPicker.dart';
export 'util/DartUtil.dart';
...@@ -5,10 +5,13 @@ ...@@ -5,10 +5,13 @@
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_common/commonModel/eventbus/GlobalEventBus.dart'; import 'package:flutter_common/commonModel/eventbus/GlobalEventBus.dart';
import 'package:flutter_common/commonModel/view/iOSLoading.dart'; import 'package:flutter_common/commonModel/view/iOSLoading.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:gm_flutter/commonModel/GMBase.dart'; import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/util/DartUtil.dart';
import 'package:gm_flutter/commonModel/view/ImagesAnimation.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
double SCREENWIDTH; double SCREENWIDTH;
...@@ -25,9 +28,8 @@ AppBar baseAppBar( ...@@ -25,9 +28,8 @@ AppBar baseAppBar(
double elevation = 0.0, double elevation = 0.0,
Widget titleWidget = null}) { Widget titleWidget = null}) {
return _baseAppBarChangeTitle( return _baseAppBarChangeTitle(
title: title == null title:
? Container() title == null ? Container() : baseText(title, 16, Color(0xff323232)),
: baseText(title, 16, Color(0xff323232)),
action: action, action: action,
centerTitle: centerTitle, centerTitle: centerTitle,
backClick: backClick, backClick: backClick,
...@@ -68,7 +70,7 @@ AppBar _baseAppBarChangeTitle( ...@@ -68,7 +70,7 @@ AppBar _baseAppBarChangeTitle(
width: 30, width: 30,
height: 30, height: 30,
child: Image.asset( child: Image.asset(
"images/left_arrow.png", "assets/left_arrow.png",
color: Color(0xff323232), color: Color(0xff323232),
), ),
))), ))),
...@@ -248,8 +250,107 @@ Widget baseRedPoint(int num) { ...@@ -248,8 +250,107 @@ Widget baseRedPoint(int num) {
alignment: Alignment.center, alignment: Alignment.center,
width: 15, width: 15,
height: 15, height: 15,
decoration: decoration: BoxDecoration(shape: BoxShape.circle, color: Color(0xffFF5963)),
BoxDecoration(shape: BoxShape.circle, color: Color(0xffFF5963)),
child: baseText("${num}", 11, Color(0xffFFFFFF)), child: baseText("${num}", 11, Color(0xffFFFFFF)),
); );
} }
Widget baseRefreshView(RefreshController refreshController,
VoidCallback refresh, Widget topFix, Widget List,
{bool pullUp = false,
bool pullDown = true,
VoidCallback onLoading,
ScrollController scrollController,
CustomScrollView customScrollView}) {
return SmartRefresher(
enablePullDown: pullDown,
enablePullUp: pullUp,
onLoading: onLoading ?? () {},
header: normalRefreshHeader(),
controller: refreshController,
onRefresh: refresh,
footer: CustomFooter(
builder: (BuildContext context, LoadStatus mode) {
Widget body;
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 {
body = Container();
}
return Container(
height: 55.0,
child: Center(child: body),
);
},
),
child: customScrollView ??
CustomScrollView(
controller: scrollController,
slivers: <Widget>[
SliverToBoxAdapter(
child: topFix,
),
List,
],
));
}
Widget normalRefreshHeader() {
return CustomHeader(
builder: (BuildContext context, RefreshStatus mode) {
Widget body;
// if (mode == RefreshStatus.idle) {
//
// } else
if (mode == RefreshStatus.refreshing) {
body = ImagesAnimation(
w: 46,
h: 15,
durationSeconds: 1500,
entry: ImagesAnimationEntry(1, 20, "assets/ptr_header_loading"));
}
// else if (mode == RefreshStatus.failed) {
// body = Text("Load Failed!Click retry!");
// }
else {
body = Image.asset(
"assets/ptr_header_loading01.png",
width: 46,
height: 15,
);
}
return Container(
height: 55.0,
child: Center(child: body),
);
},
);
}
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)),
),
],
);
}
...@@ -59,7 +59,8 @@ class MyApp extends State<MyAppWidget> { ...@@ -59,7 +59,8 @@ class MyApp extends State<MyAppWidget> {
return DemoPage1(); return DemoPage1();
}, },
}); });
FlutterBoost.singleton.addBoostContainerLifeCycleObserver((state, settings) { FlutterBoost.singleton
.addBoostContainerLifeCycleObserver((state, settings) {
print("LSY ${state}"); print("LSY ${state}");
}); });
// FlutterBoost.singleton.addBoostNavigatorObserver(TestBoostNavigatorObserver()); // FlutterBoost.singleton.addBoostNavigatorObserver(TestBoostNavigatorObserver());
...@@ -83,6 +84,19 @@ home: RouterCenterImpl().findClueRouter().getProjectDetailsPage(), ...@@ -83,6 +84,19 @@ home: RouterCenterImpl().findClueRouter().getProjectDetailsPage(),
// ), // ),
// ) // )
); );
theme: ThemeData(
primaryColor: Colors.white,
cursorColor: Color(0xff20BDBB),
canvasColor: Colors.white),
builder: FlutterBoost.init(postPush: _onRoutePushed),
home: isDebug
? RouterCenterImpl().findMainRouter().getTestPage()
: Container(
color: Colors.white,
child: Center(
child: loadingItem(),
),
));
} }
void _onRoutePushed( void _onRoutePushed(
......
...@@ -3,7 +3,7 @@ description: A new flutter module project. ...@@ -3,7 +3,7 @@ description: A new flutter module project.
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: ">=2.1.0 <3.0.0" sdk: ">=2.6.0 <3.0.0"
dependencies: dependencies:
flutter: flutter:
...@@ -32,6 +32,7 @@ dependencies: ...@@ -32,6 +32,7 @@ dependencies:
#轻量级存储 #轻量级存储
shared_preferences: ^0.5.7+1 shared_preferences: ^0.5.7+1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
...@@ -40,7 +41,8 @@ dev_dependencies: ...@@ -40,7 +41,8 @@ dev_dependencies:
flutter: flutter:
uses-material-design: true uses-material-design: true
assets:
- assets/
module: module:
androidX: true androidX: true
androidPackage: com.example.gm_flutter androidPackage: com.example.gm_flutter
......
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