Commit f3daabf2 authored by 杜欣's avatar 杜欣

二级方案

parent 8c323111
...@@ -10,6 +10,7 @@ import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; ...@@ -10,6 +10,7 @@ import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/commonModel/GMBase.dart'; import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart'; import 'package:gm_flutter/commonModel/bean/Pair.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart'; import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
class LevelTwoModel extends BaseModel { class LevelTwoModel extends BaseModel {
...@@ -24,9 +25,9 @@ class LevelTwoModel extends BaseModel { ...@@ -24,9 +25,9 @@ class LevelTwoModel extends BaseModel {
LiveData<Pair<int, List<Cards>>> cardsLive = LiveData(); LiveData<Pair<int, List<Cards>>> cardsLive = LiveData();
Map<int, List<Cards>> data = new Map(); Map<int, List<Cards>> data = new Map();
List list = ["plan", "hospital", "doctor", "diary"]; List list = ["hospital", "doctor"];
List pageList = [1, 1, 1, 1]; List pageList = [1, 1];
List pageHeightList = [118, 149, 118, 118]; List pageHeightList = [149, 118];
void refreshView(bool clear, {RefreshController refreshListener}) { void refreshView(bool clear, {RefreshController refreshListener}) {
Future.delayed(Duration(seconds: 1), () { Future.delayed(Duration(seconds: 1), () {
...@@ -57,17 +58,19 @@ class LevelTwoModel extends BaseModel { ...@@ -57,17 +58,19 @@ class LevelTwoModel extends BaseModel {
cardsLive.notifyView(Pair(ENDLOADING, data)); cardsLive.notifyView(Pair(ENDLOADING, data));
}); });
// int index = currentIndex; int index = currentIndex;
// if (clear) { if (clear) {
// data.clear(); data.clear();
// pageList = [1, 1, 1, 1]; pageList = [1, 1];
// } }
// ClueApiImpl.getInstance() ClueApiImpl.getInstance()
// .getLevelOneList( .getLevelOneList(
// DioUtil.getInstance().getDio(), 123, list[index], pageList[index]) DioUtil.getInstance().getDio(), 123, list[index], pageList[index])
// .listen((event) {}) .listen((event) {})
// .addToDispose(rxDispose) .addToDispose(rxDispose)
// .onError((err) {}); .onError((err) {
PrintUtil.printBug(err);
});
} }
int currentIndex = 0; int currentIndex = 0;
......
...@@ -6,10 +6,8 @@ ...@@ -6,10 +6,8 @@
import 'dart:math'; import 'dart:math';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_common/commonModel/picker/base/BaseBottomPicker.dart'; import 'package:flutter_common/commonModel/picker/base/BaseBottomPicker.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneItem.dart';
import 'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoModel.dart'; import 'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoModel.dart';
import 'package:gm_flutter/ClueModel/page/mechanismBox/MechanismBoxPage.dart'; import 'package:gm_flutter/ClueModel/page/mechanismBox/MechanismBoxPage.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
...@@ -21,6 +19,11 @@ import 'package:pull_to_refresh/pull_to_refresh.dart'; ...@@ -21,6 +19,11 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart'; import 'package:gm_flutter/commonModel/bean/Pair.dart';
class LevelTwoPage extends StatefulWidget { class LevelTwoPage extends StatefulWidget {
@required
final int plan_id;
const LevelTwoPage({Key key, this.plan_id}) : super(key: key);
@override @override
_LevelTwoPageState createState() => _LevelTwoPageState(); _LevelTwoPageState createState() => _LevelTwoPageState();
} }
...@@ -49,7 +52,21 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage> ...@@ -49,7 +52,21 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage>
@override @override
Widget buildItem(BuildContext context) { Widget buildItem(BuildContext context) {
return Scaffold( return Scaffold(
body: Stack( body: StreamBuilder<bool>(
stream: _model.loadingLive.stream,
initialData: true,
builder: (c, data) {
if (!data.data) {
return loadingItem();
} else {
return home();
}
},
));
}
Widget home() {
return Stack(
children: <Widget>[ children: <Widget>[
CustomScrollView(slivers: <Widget>[ CustomScrollView(slivers: <Widget>[
SliverAppBar( SliverAppBar(
...@@ -81,14 +98,11 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage> ...@@ -81,14 +98,11 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage>
tabs: <Widget>[Tab(text: '医院'), Tab(text: '医生')]), tabs: <Widget>[Tab(text: '医院'), Tab(text: '医生')]),
), ),
), ),
SliverFillRemaining( SliverFillRemaining(child: pages())
child: TabBarView(
controller: this.tabController,
children: <Widget>[pages(), pages()]))
]), ]),
Positioned(left: 0, right: 0, bottom: 0, child: bottomWidget()) Positioned(left: 0, right: 0, bottom: 0, child: bottomWidget())
], ],
)); );
} }
Widget good() { Widget good() {
...@@ -277,7 +291,7 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage> ...@@ -277,7 +291,7 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage>
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
BaseBottomPicker() BaseBottomPicker()
..setPicker(MechanismBox()) ..setPicker(MechanismBox(12))
..show(context); ..show(context);
}, },
child: Container( child: Container(
...@@ -312,128 +326,76 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage> ...@@ -312,128 +326,76 @@ class _LevelTwoPageState extends BaseState<LevelTwoPage>
} }
Widget pages() { Widget pages() {
return Container( return StreamBuilder<Pair<int, List<Cards>>>(
margin: EdgeInsets.only(top: 5), stream: _model.cardsLive.stream,
width: double.maxFinite, initialData: _model.cardsLive.data ?? Pair(LOADING, null),
child: ListView.builder( builder: (c, data) {
physics: NeverScrollableScrollPhysics(), return Container(
itemBuilder: (c, index) { margin: EdgeInsets.only(top: 5),
return Text('$index'); width: double.maxFinite,
}, child: TabBarView(
itemCount: 5, controller: tabController,
)); children: _model.data[tabController.index].map((e) {
} return ListView.builder(
} physics: NeverScrollableScrollPhysics(),
itemBuilder: (c, index) {
Widget DoctorItem(BuildContext context, cards) { return Text('$index');
if (cards.doctor == null && isDebug) { },
throw new Exception(); itemCount: 5,
);
}).toList()));
});
} }
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(),
),
],
),
),
);
}
Widget HospitalItem(BuildContext context, cards) { Widget DoctorItem(BuildContext context, cards) {
if (cards.hospital == null && isDebug) { if (cards.doctor == null && isDebug) {
throw new Exception(); throw new Exception();
} }
return GestureDetector( return GestureDetector(
onTap: () {},
child: Container( child: Container(
margin: EdgeInsets.only(left: 15, right: 15), margin: EdgeInsets.only(left: 15, right: 15),
height: 149, height: 127,
child: Stack( child: Stack(
children: <Widget>[ children: <Widget>[
Positioned( Positioned(
left: 0,
top: 15, top: 15,
child: Container( child: Container(
width: 45, width: 45,
height: 45, height: 45,
child: ClipOval( child: ClipOval(
child: CachedNetworkImage( child: CachedNetworkImage(
imageUrl: cards.hospital.portrait, imageUrl: cards.doctor.portrait,
), ),
), ),
), ),
), ),
Positioned( Positioned(
left: 57, left: 57,
top: 17.5, top: 18,
child: baseText(cards.hospital.name, 15, Color(0xff333333), child: Row(
bold: true), 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( Positioned(
top: 42.5, top: 42,
right: 0, right: 0,
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)), baseText("¥", 12, Color(0xffFF5963)),
baseText( baseText("${cards.doctor.minPrice}-${cards.doctor.maxPrice}",
"${cards.hospital.minPrice}-${cards.hospital.maxPrice}", 15, Color(0xffFF5963)),
15,
Color(0xffFF5963)),
], ],
), ),
), ),
...@@ -447,47 +409,111 @@ Widget HospitalItem(BuildContext context, cards) { ...@@ -447,47 +409,111 @@ Widget HospitalItem(BuildContext context, cards) {
right: 187, right: 187,
child: askWidget(), child: askWidget(),
), ),
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 lowPriceWidget() { Widget HospitalItem(BuildContext context, cards) {
return GestureDetector( if (cards.hospital == null && isDebug) {
behavior: HitTestBehavior.opaque, throw new Exception();
child: Container( }
width: 122, return GestureDetector(
height: 37, onTap: () {},
decoration: BoxDecoration( child: Container(
borderRadius: BorderRadius.circular(18.5), color: Color(0xffFFF5F5)), margin: EdgeInsets.only(left: 15, right: 15),
alignment: Alignment.center, height: 149,
child: baseText("获取底价", 14, Color(0xffFF5963), bold: true), 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(
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 askWidget() { Widget lowPriceWidget() {
return GestureDetector( return GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
child: Container( child: Container(
width: 122, width: 122,
height: 37, height: 37,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(18.5), color: Color(0xffEEFDFD)), borderRadius: BorderRadius.circular(18.5),
alignment: Alignment.center, color: Color(0xffFFF5F5)),
child: baseText("咨询", 14, Color(0xff3FB5AF), bold: true), alignment: Alignment.center,
), child: baseText("获取底价", 14, Color(0xffFF5963), bold: true),
); ),
);
}
Widget askWidget() {
return GestureDetector(
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),
),
);
}
} }
class StickyTabBarDelegate extends SliverPersistentHeaderDelegate { class StickyTabBarDelegate extends SliverPersistentHeaderDelegate {
......
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_common/commonModel/picker/base/BaseBottomPicker.dart'; import 'package:flutter_common/commonModel/picker/base/BaseBottomPicker.dart';
import 'package:gm_flutter/ClueModel/server/entity/ConsultQuestionsBean.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';
import 'package:gm_flutter/ClueModel/page/mechanismBox/MechanismModel.dart';
class MechanismBox implements IBottomPicker { class MechanismBox implements IBottomPicker {
VoidCallback dismissCall; VoidCallback dismissCall;
TextEditingController textController = TextEditingController(); TextEditingController textController = TextEditingController();
MechanismModel _model = new MechanismModel();
@required
final int plan_id;
MechanismBox(this.plan_id) : super();
@override @override
initState(dismissCall, BuildContext context) { initState(dismissCall, BuildContext context) {
this.dismissCall = dismissCall; this.dismissCall = dismissCall;
_model.getQuestions(plan_id);
} }
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -19,87 +34,183 @@ class MechanismBox implements IBottomPicker { ...@@ -19,87 +34,183 @@ class MechanismBox implements IBottomPicker {
width: mq.size.width, width: mq.size.width,
height: mq.size.height - 140, height: mq.size.height - 140,
color: Colors.white, color: Colors.white,
child: Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
title(mq),
mechanismList(mq, keyHeight),
bottomMessage()
],
)),
);
}
@override
void dispose() {
textController.dispose();
}
// 弹窗标题
Widget title(mq) {
return Container(
margin: EdgeInsets.only(left: 20, right: 20),
width: mq.size.width,
decoration: BoxDecoration(
border:
Border(bottom: BorderSide(width: 1, color: Color(0xffE5E5E5)))),
height: 50,
child: Stack(
alignment: Alignment.center,
children: <Widget>[
Container(
child: Text(
'请选择要咨询的机构',
style: TextStyle(
color: Color(0xff282828),
fontSize: 17,
fontWeight: FontWeight.bold),
),
),
Positioned(
right: 0,
top: 16.0,
child: GestureDetector(
onTap: () {
dismissCall();
},
child: Container(
width: 14,
height: 14,
child: Image.asset("assets/close-btn.png"),
),
))
],
),
);
}
// 机构列表
Widget mechanismList(mq, keyHeight) {
return Container(
height: mq.size.height - 140 - 96 - 50 - keyHeight,
width: mq.size.width,
padding: EdgeInsets.only(left: 15, right: 15),
child: ListView.separated(
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return HospitalItem(context, index);
},
separatorBuilder: (BuildContext context, int index) {
return Divider(color: Color(0xffE5E5E5));
},
));
}
// 机构卡片
Widget HospitalItem(BuildContext context, int index) {
return GestureDetector(
onTap: () {},
child: Container(
height: 94.5,
child: Stack( child: Stack(
children: <Widget>[ children: <Widget>[
Container( Positioned(
margin: EdgeInsets.only(left: 20, right: 20), left: 0,
width: mq.size.width, top: 35,
decoration: BoxDecoration( child: Container(
border: Border( height: 17,
bottom: width: 17,
BorderSide(width: 1, color: Color(0xffE5E5E5)))), child: true
height: 50, ? Image.asset("assets/icon-checked.png")
child: Stack( : Image.asset("assets/icon-check.png"),
alignment: Alignment.center, )),
children: <Widget>[ Positioned(
Container( left: 32,
child: Text( top: 21,
'请选择要咨询的机构', child: Container(
style: TextStyle( width: 45,
color: Color(0xff282828), height: 45,
fontSize: 17, child: ClipOval(
fontWeight: FontWeight.bold), child: CachedNetworkImage(
), // imageUrl: cards.hospital.portrait,
imageUrl:
'https://img1.gamersky.com/image2019/07/20190725_ll_red_136_2/gamersky_07small_14_201972510258D0.jpg',
), ),
Positioned( ),
right: 0, ),
top: 16.0, ),
child: GestureDetector( Positioned(
onTap: () { left: 89,
dismissCall(); top: 17.5,
}, // child: baseText(cards.hospital.name, 15, Color(0xff333333),
child: Container( // bold: true),
width: 14, child: baseText('22222', 15, Color(0xff333333), bold: true),
height: 14, ),
child: Image.asset("assets/close-btn.png"), Positioned(
), top: 42.5,
)) right: 0,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
baseText("¥", 12, Color(0xffFF5963)),
baseText("${1}-${2}", 15, Color(0xffFF5963)),
], ],
), ),
), ),
Container(
height: mq.size.height - 140 - 96 - 50,
width: mq.size.width,
margin: EdgeInsets.only(top: 50),
padding: EdgeInsets.only(left: 20, right: 20),
child: ListView.separated(
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return ListTile(title: Text("$index"));
},
separatorBuilder: (BuildContext context, int index) {
return Divider(color: Color(0xffE5E5E5));
},
)),
Positioned( Positioned(
bottom: keyHeight == 0 ? 0 : keyHeight, bottom: 21,
left: 0, left: 89,
width: double.maxFinite, // child: baseText(cards.hospital.address, 12, Color(0xff666666)),
height: 96, child: baseText('dsssssssss', 12, Color(0xff666666)),
child: Container( ),
height: 96, Positioned(
color: Color(0xffF9F8FB), left: 89,
child: Column( top: 38.5,
children: <Widget>[ child: FiveStarView(2, 5),
Container( )
height: 25, ],
color: Colors.black, ),
width: double.maxFinite, ));
margin: EdgeInsets.only(top: 12), }
child: ListView(
scrollDirection: Axis.horizontal, //横向滚动 // 底部输入框部分
children: <Widget>[ Widget bottomMessage() {
Container( return Container(
margin: EdgeInsets.only(left: 15, right: 8), height: 96,
height: 25, color: Color(0xffF9F8FB),
child: Text( child: Column(
'我想', children: <Widget>[
style: TextStyle( Container(
height: 2, height: 25,
color: Color(0xff666666), width: double.maxFinite,
fontSize: 12), margin: EdgeInsets.only(top: 12),
)), child: Row(
Container( mainAxisSize: MainAxisSize.max,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 15, right: 8),
height: 25,
child: Text(
'我想',
style: TextStyle(
height: 2,
color: Color(0xff666666),
fontSize: 12),
)),
StreamBuilder<ConsultQuestionsBean>(
stream: _model.questionsLive.stream,
initialData: _model.questionsLive.data,
builder: (c, data) {
List<String> questions = data.data.data.questions;
return ListView.builder(
scrollDirection: Axis.horizontal, //横向滚动
itemBuilder: (c, index) {
return GestureDetector(
onTap: () {
textController.text += questions[index];
},
child: Container(
height: 25, height: 25,
margin: EdgeInsets.only(right: 12), margin: EdgeInsets.only(right: 12),
padding: EdgeInsets.only(left: 8, right: 8), padding: EdgeInsets.only(left: 8, right: 8),
...@@ -109,98 +220,41 @@ class MechanismBox implements IBottomPicker { ...@@ -109,98 +220,41 @@ class MechanismBox implements IBottomPicker {
color: Color(0xffffffff), color: Color(0xffffffff),
borderRadius: BorderRadius.circular(20)), borderRadius: BorderRadius.circular(20)),
child: Text( child: Text(
'有优惠活动吗?', questions[index],
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: Color(0xff666666), color: Color(0xff666666),
height: 1.8), height: 1.8),
), ),
), ),
Container( );
height: 25, },
margin: EdgeInsets.only(right: 12), itemCount: questions.length,
padding: EdgeInsets.only(left: 8, right: 8), );
decoration: BoxDecoration( }),
border: Border.all( ],
color: Color(0xffE5E5E5), )),
width: 0.5), Container(
color: Color(0xffffffff), height: 35,
borderRadius: width: double.maxFinite,
BorderRadius.circular(20)), margin: EdgeInsets.only(top: 12, left: 15, right: 15),
child: Text( decoration: BoxDecoration(
'111有优惠活动吗?', border: Border.all(color: Color(0xffE5E5E5), width: 0.5),
style: TextStyle( color: Color(0xffffffff),
fontSize: 12, borderRadius: BorderRadius.circular(35)),
color: Color(0xff666666), child: TextField(
height: 1.8), controller: textController,
)), keyboardType: TextInputType.text,
Container( textInputAction: TextInputAction.send,
height: 25, onSubmitted: (txt) {},
margin: EdgeInsets.only(right: 12), style: TextStyle(fontSize: 12),
padding: EdgeInsets.only(left: 8, right: 8), maxLines: 1,
decoration: BoxDecoration( decoration: InputDecoration(
border: Border.all( contentPadding: EdgeInsets.only(
color: Color(0xffE5E5E5), left: 16, top: 0, bottom: 12, right: 16),
width: 0.5), hintText: '请输入您想了解的问题',
color: Color(0xffffffff), border: InputBorder.none)))
borderRadius: ],
BorderRadius.circular(20)), ));
child: Text(
'111有优惠活动吗?',
style: TextStyle(
fontSize: 12,
color: Color(0xff666666),
height: 1.8),
)),
Container(
height: 25,
margin: EdgeInsets.only(right: 12),
padding: EdgeInsets.only(left: 8, right: 8),
decoration: BoxDecoration(
border: Border.all(
color: Color(0xffE5E5E5),
width: 0.5),
color: Color(0xffffffff),
borderRadius:
BorderRadius.circular(20)),
child: Text(
'111有优惠活动吗?',
style: TextStyle(
fontSize: 12,
color: Color(0xff666666),
height: 1.8),
))
],
),
),
Container(
height: 35,
margin:
EdgeInsets.only(top: 12, left: 15, right: 15),
decoration: BoxDecoration(
border: Border.all(
color: Color(0xffE5E5E5), width: 0.5),
color: Color(0xffffffff),
borderRadius: BorderRadius.circular(35)),
child: TextField(
controller: textController,
keyboardType: TextInputType.text,
textInputAction: TextInputAction.send,
onSubmitted: (txt) {},
decoration: InputDecoration(
contentPadding: EdgeInsets.all(16.0),
labelText: '文案文案文案不知道文案是啥',
border: InputBorder.none)),
)
],
)))
],
)),
);
}
@override
void dispose() {
textController.dispose();
} }
} }
/*
* @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/ConsultQuestionsBean.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';
class MechanismModel extends BaseModel {
LiveData<ConsultQuestionsBean> questionsLive = LiveData();
RxDispose rxDispose = RxDispose();
getQuestions(int plan_id) {
ClueApiImpl.getInstance()
.getConsultQuestions(DioUtil.getInstance().getDio(), plan_id)
.listen((event) {
print('dadsadsa');
print(event.data.questions.toList());
print('dadsadsa');
questionsLive.data = event;
})
.addToDispose(rxDispose)
.onError((err) {
PrintUtil.printBug(err);
});
}
@override
void dispose() {
questionsLive.dispost();
}
}
...@@ -3,14 +3,19 @@ ...@@ -3,14 +3,19 @@
* @date 2020/6/28 * @date 2020/6/28
**/ **/
import 'package:flutter_common/Annotations/anno/Get.dart'; import 'package:flutter_common/Annotations/anno/Get.dart';
import 'package:flutter_common/Annotations/anno/Post.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/ConsultQuestionsBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanOverviewBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlansCompareFeed.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlansCompareFeed.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/PlanBean.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart';
import 'package:gm_flutter/commonModel/net/Responce/SimpleResponce.dart';
@ServiceCenter() @ServiceCenter()
abstract class ClueApi { abstract class ClueApi {
@Get("/api/janus/plans/plan_detail") @Get("/api/janus/plans/plan_detail")
...@@ -32,12 +37,22 @@ abstract class ClueApi { ...@@ -32,12 +37,22 @@ abstract class ClueApi {
@Get("api/janus/plans/feed") @Get("api/janus/plans/feed")
PlanFeedBean getPlanFeed( PlanFeedBean getPlanFeed(
@Query("tag_id")String tag_id, @Query("tag_id") String tag_id,
@Query("order_by")String order_by, @Query("order_by") String order_by,
@Query("current_city_id")String current_city_id, @Query("current_city_id") String current_city_id,
@Query("min_price")String min_price, @Query("min_price") String min_price,
@Query("max_price")String max_price, @Query("max_price") String max_price,
@Query("rank_type")String rank_type, @Query("rank_type") String rank_type,
@Query("page")int page, @Query("page") int page,
); );
@Get("/api/janus/plans/plan_overview")
PlanOverviewBean getPlanOverviewBean(@Query("plan_id") int plan_id);
@Get("/api/janus/plans/consult_questions")
ConsultQuestionsBean getConsultQuestions(@Query("plan_id") int plan_id);
@Post("/api/janus/plans/plan_consult")
SimpleResponce sendMessage(@Query("doctor_ids") List<int> doctor_ids,
@Query("question") String question, @Query("plan_id") int plan_id);
} }
...@@ -20,6 +20,9 @@ import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; ...@@ -20,6 +20,9 @@ import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanBean.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanOverviewBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/ConsultQuestionsBean.dart';
import 'package:gm_flutter/commonModel/net/Responce/SimpleResponce.dart';
const bool inProduction = const bool.fromEnvironment("dart.vm.product"); const bool inProduction = const bool.fromEnvironment("dart.vm.product");
...@@ -139,6 +142,52 @@ class ClueApiImpl { ...@@ -139,6 +142,52 @@ class ClueApiImpl {
}); });
} }
Stream<PlanOverviewBean> getPlanOverviewBean(Dio _dio, int plan_id) {
return Stream.fromFuture(get(_dio, '/api/janus/plans/plan_overview', data: {
'plan_id': plan_id,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parsePlanOverviewBean, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
Stream<ConsultQuestionsBean> getConsultQuestions(Dio _dio, int plan_id) {
return Stream.fromFuture(
get(_dio, '/api/janus/plans/consult_questions', data: {
'plan_id': plan_id,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parseConsultQuestionsBean, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
Stream<SimpleResponce> sendMessage(
Dio _dio, List<int> doctor_ids, String question, int plan_id) {
return Stream.fromFuture(post(_dio, '/api/janus/plans/plan_consult', data: {
'doctor_ids': doctor_ids,
'question': question,
'plan_id': plan_id,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parseSimpleResponce, 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 {
...@@ -299,3 +348,15 @@ PlanBean parsePlanBean(String value) { ...@@ -299,3 +348,15 @@ PlanBean parsePlanBean(String value) {
PlanFeedBean parsePlanFeedBean(String value) { PlanFeedBean parsePlanFeedBean(String value) {
return PlanFeedBean.fromJson(json.decode(value)); return PlanFeedBean.fromJson(json.decode(value));
} }
PlanOverviewBean parsePlanOverviewBean(String value) {
return PlanOverviewBean.fromJson(json.decode(value));
}
ConsultQuestionsBean parseConsultQuestionsBean(String value) {
return ConsultQuestionsBean.fromJson(json.decode(value));
}
SimpleResponce parseSimpleResponce(String value) {
return SimpleResponce.fromJson(json.decode(value));
}
class ConsultQuestionsBean {
int error;
String message;
Null extra;
Null errorExtra;
UserType userType;
Data data;
ConsultQuestionsBean(
{this.error,
this.message,
this.extra,
this.errorExtra,
this.userType,
this.data});
ConsultQuestionsBean.fromJson(Map<String, dynamic> json) {
error = json['error'];
message = json['message'];
extra = json['extra'];
errorExtra = json['error_extra'];
userType = json['user_type'] != null
? new UserType.fromJson(json['user_type'])
: null;
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['error'] = this.error;
data['message'] = this.message;
data['extra'] = this.extra;
data['error_extra'] = this.errorExtra;
if (this.userType != null) {
data['user_type'] = this.userType.toJson();
}
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class UserType {
UserType();
UserType.fromJson(Map<String, dynamic> json) {}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
return data;
}
}
class Data {
List<String> questions;
Data({this.questions});
Data.fromJson(Map<String, dynamic> json) {
questions = json['questions'].cast<String>();
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['questions'] = this.questions;
return data;
}
}
class PlanOverviewBean {
int error;
String message;
Null extra;
Null errorExtra;
UserType userType;
Data data;
PlanOverviewBean(
{this.error,
this.message,
this.extra,
this.errorExtra,
this.userType,
this.data});
PlanOverviewBean.fromJson(Map<String, dynamic> json) {
error = json['error'];
message = json['message'];
extra = json['extra'];
errorExtra = json['error_extra'];
userType = json['user_type'] != null
? new UserType.fromJson(json['user_type'])
: null;
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['error'] = this.error;
data['message'] = this.message;
data['extra'] = this.extra;
data['error_extra'] = this.errorExtra;
if (this.userType != null) {
data['user_type'] = this.userType.toJson();
}
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class UserType {
UserType();
UserType.fromJson(Map<String, dynamic> json) {}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
return data;
}
}
class Data {
Banner banner;
String name;
String positiveRate;
String salesCount;
String planDescription;
List<OverviewAttrs> overviewAttrs;
List<ExplanationAttrs> explanationAttrs;
List<Tabs> tabs;
Data(
{this.banner,
this.name,
this.positiveRate,
this.salesCount,
this.planDescription,
this.overviewAttrs,
this.explanationAttrs,
this.tabs});
Data.fromJson(Map<String, dynamic> json) {
banner =
json['banner'] != null ? new Banner.fromJson(json['banner']) : null;
name = json['name'];
positiveRate = json['positive_rate'];
salesCount = json['sales_count'];
planDescription = json['plan_description'];
if (json['overview_attrs'] != null) {
overviewAttrs = new List<OverviewAttrs>();
json['overview_attrs'].forEach((v) {
overviewAttrs.add(new OverviewAttrs.fromJson(v));
});
}
if (json['explanation_attrs'] != null) {
explanationAttrs = new List<ExplanationAttrs>();
json['explanation_attrs'].forEach((v) {
explanationAttrs.add(new ExplanationAttrs.fromJson(v));
});
}
if (json['tabs'] != null) {
tabs = new List<Tabs>();
json['tabs'].forEach((v) {
tabs.add(new Tabs.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.banner != null) {
data['banner'] = this.banner.toJson();
}
data['name'] = this.name;
data['positive_rate'] = this.positiveRate;
data['sales_count'] = this.salesCount;
data['plan_description'] = this.planDescription;
if (this.overviewAttrs != null) {
data['overview_attrs'] =
this.overviewAttrs.map((v) => v.toJson()).toList();
}
if (this.explanationAttrs != null) {
data['explanation_attrs'] =
this.explanationAttrs.map((v) => v.toJson()).toList();
}
if (this.tabs != null) {
data['tabs'] = this.tabs.map((v) => v.toJson()).toList();
}
return data;
}
}
class Banner {
String type;
String imageUrl;
String videoUrl;
Banner({this.type, this.imageUrl, this.videoUrl});
Banner.fromJson(Map<String, dynamic> json) {
type = json['type'];
imageUrl = json['image_url'];
videoUrl = json['video_url'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type'] = this.type;
data['image_url'] = this.imageUrl;
data['video_url'] = this.videoUrl;
return data;
}
}
class OverviewAttrs {
int attrId;
String attrName;
String attrValue;
OverviewAttrs({this.attrId, this.attrName, this.attrValue});
OverviewAttrs.fromJson(Map<String, dynamic> json) {
attrId = json['attr_id'];
attrName = json['attr_name'];
attrValue = json['attr_value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['attr_id'] = this.attrId;
data['attr_name'] = this.attrName;
data['attr_value'] = this.attrValue;
return data;
}
}
class ExplanationAttrs {
int attrId;
String attrName;
String attrValue;
ExplanationAttrs({this.attrId, this.attrName, this.attrValue});
ExplanationAttrs.fromJson(Map<String, dynamic> json) {
attrId = json['attr_id'];
attrName = json['attr_name'];
attrValue = json['attr_value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['attr_id'] = this.attrId;
data['attr_name'] = this.attrName;
data['attr_value'] = this.attrValue;
return data;
}
}
class Tabs {
String tabType;
String name;
Tabs({this.tabType, this.name});
Tabs.fromJson(Map<String, dynamic> json) {
tabType = json['tab_type'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['tab_type'] = this.tabType;
data['name'] = this.name;
return data;
}
}
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