Commit f5a032ba authored by 林生雨's avatar 林生雨

Merge branch 'zx/gmFlutter' into 'test'

Zx/gm flutter

See merge request !2
parents f50eb013 d8bc4810
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Flutter",
"request": "launch",
"type": "dart"
}
]
}
\ No newline at end of file
...@@ -17,4 +17,5 @@ abstract class ClueRouter implements RouterBaser { ...@@ -17,4 +17,5 @@ abstract class ClueRouter implements RouterBaser {
Widget getLevelOnePage(); Widget getLevelOnePage();
Widget getPlanPage(); Widget getPlanPage();
Widget getPlanCompareDetailPage();
} }
...@@ -8,6 +8,7 @@ import 'package:gm_flutter/ClueModel/page/PlansCompareFeed/PlansCompareFeedPage. ...@@ -8,6 +8,7 @@ import 'package:gm_flutter/ClueModel/page/PlansCompareFeed/PlansCompareFeedPage.
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'; import 'package:gm_flutter/ClueModel/page/levelOne/LevelOnePage.dart';
import 'package:gm_flutter/ClueModel/page/plan/PlanPage.dart'; import 'package:gm_flutter/ClueModel/page/plan/PlanPage.dart';
import 'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart';
class ClueRouterImpl implements ClueRouter { class ClueRouterImpl implements ClueRouter {
@override @override
...@@ -29,4 +30,8 @@ class ClueRouterImpl implements ClueRouter { ...@@ -29,4 +30,8 @@ class ClueRouterImpl implements ClueRouter {
Widget getPlanPage() { Widget getPlanPage() {
return PlanPage(); return PlanPage();
} }
Widget getPlanCompareDetailPage() {
return PlanCompareDetailPage();
}
} }
/*
* @Author: zx
* @Date: 2020-06-30 17:43:13
* @Last Modified by: zx
* @Last Modified time: 2020-07-01 20:04:23
*/
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/PlanCompareDetail.dart';
import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
class PlanCompareDetailModel extends BaseModel {
LiveData<PlanCompareDetail> detailLive = LiveData();
RxDispose rxDispose = RxDispose();
void init() {
ClueApiImpl.getInstance()
.getPlanCompareDetail(DioUtil.getInstance().getDio(), [1,2])
.listen((event) {
if (event.error == 0) {
detailLive.notifyView(event);
}
})
.addToDispose(rxDispose)
.onError((err) {});
}
@override
void dispose() {
detailLive.dispost();
}
}
\ No newline at end of file
/*
* @Author: zx
* @Date: 2020-06-30 17:40:43
* @Last Modified by: zx
* @Last Modified time: 2020-07-01 22:11:20
*/
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:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailModel.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.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';
class PlanCompareDetailPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => PlanCompareDetailPageState();
}
class PlanCompareDetailPageState extends BaseState<PlanCompareDetailPage> {
PlanCompareDetailModel _model = new PlanCompareDetailModel();
PageController pageController = new PageController();
double screenWidth;
List<Widget> viewList = new List();
@override
void initState() {
super.initState();
pageController.addListener(() {
});
Groups groups;
viewList.add(planNormalEffectiveAttrsView(groups));
viewList.add(planNormalEffectiveAttrsView(groups));
viewList.add(planNormalEffectiveAttrsView(groups));
}
@override
void dispose() {
_model.dispose();
pageController.dispose();
pageController.dispose();
super.dispose();
}
@override
Widget buildItem(BuildContext context) {
screenWidth = MediaQuery.of(context).size.width;
return Scaffold(
appBar: baseAppBar(
title: "对比详情",
centerTitle: true,
backClick: () {
Navigator.pop(context);
}),
body: Container(
child:
// planPopularityView()
// planNormalEffectiveAttrsView()
// setupHome([], []),
reloadPage(),
)
);
}
Widget reloadPage () {
return StreamBuilder(
stream: _model.detailLive.stream,
initialData: PlanCompareDetail(),
builder: (c, data) {
PlanCompareDetail detail = data.data;
if (detail == null || detail.data == null || detail.data.groups == null) {
return loadingItem();
}
return setupHome(detail.data.plansInfo, detail.data.groups);
},
);
}
Widget setupHome(List<PlansInfo> plansInfo, List<Groups> groups) {
return Column(
children: <Widget>[
Expanded(
child: Stack(
children: <Widget>[
head(plansInfo),
Expanded (
child: Container(
margin: EdgeInsets.fromLTRB(15, 105, 15, 0),
child:
// ListView.builder(
// itemBuilder: (BuildContext context, int index) {
// Groups group = groups[index];
// switch (group.groupType) {
// case 'hot':
// return planPopularityView(group);
// break;
// case 'normal_attrs':
// return planNormalEffectiveAttrsView(group);
// break;
// case 'effective_attrs':
// return planNormalEffectiveAttrsView(group);
// break;
// default:
// return planNormalEffectiveAttrsView(group);
// }
// },
// itemCount: groups.length,
// )
CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return viewList[index];
},
childCount: viewList.length,
),
),
],
),
)
),
],
),
)
],
);
}
Widget head(List<PlansInfo> plansInfo) {
PlansInfo plan;
return Container(
// key: keyTop,
color: Colors.yellow,
width: screenWidth,
height: 105,
alignment: Alignment.topLeft,
margin: EdgeInsets.fromLTRB(9.5, 0, 9.5, 0),
child: Row(children: <Widget>[
// 根据 flex系数,分配剩余空间
Expanded(
flex:1,
child: headItem(plan)
),
Expanded(
flex: 1,
child: headItem(plan)
)
]
),
);
}
Widget headItem(PlansInfo plan) {
return Container(
child: Stack(
children: <Widget>[
Positioned(
child: Container(
margin: EdgeInsets.fromLTRB(5.5, 15, 5.5, 15),
width: (screenWidth - 41) / 2.0,
// child: Text('1111111'),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7.0),
image:
DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w")
)
)
),
),
Positioned(
left: 17.5,
top: 31,
child: baseText('11111', 15, Color(0xff333333),
bold: true),
),
Positioned(
left: 17.5,
bottom: 31,
child: baseText('¥¥¥¥¥¥¥¥¥¥', 14, Colors.red,
bold: true),
),
]
)
);
}
Widget titleView() {
return Container(
height: 81,
width: screenWidth,
color: Colors.cyan,
margin: EdgeInsets.fromLTRB(0, 30, 0, 13),
alignment: Alignment.topCenter,
child: Container(
child: baseText('基础属性', 21, Colors.black, bold: true),
),
);
}
Widget planPopularityView() {
return Container(
color: Colors.green,
height: 265,
child: Container (
child: Column(
children: <Widget>[
titleView(),
Row(
children: <Widget>[
Expanded(
flex:1,
child: planPopularityLeftItem()
),
Expanded(
flex: 1,
child: planPopularityRightItem()
)
]
)
]
)
),
);
}
Widget planPopularityLeftItem() {
return Container(
color: Colors.red,
// height: 80,
child:
Expanded(
child: Stack(
children: <Widget>[
Positioned(
right: 20,
top: 12,
child: baseText('99%', 21, Color(0xffF25874),
bold: true)
),
Positioned(
right: 20,
top: 33,
// bottom: 12,
child: baseText('好评率', 12, Color(0xff666666),
bold: false),
),
Positioned(
right: 20,
top: 55,
// bottom: 12,
child: FiveStarView(3,5),
),
Positioned(
right: 20,
top: 98,
bottom: 12,
child: baseText('13679个', 21, Color(0xffF25874),
bold: true),
),
Positioned(
right: 20,
top: 112,
bottom: 12,
child: baseText('销量', 12, Color(0xff666666),
bold: false),
),
Positioned(
right: 20,
top: 132,
bottom: 12,
child: baseText('', 12, Color(0xff666666),
bold: false),
),
]
)
)
);
}
Widget planPopularityRightItem() {
return Container(
color: Colors.red,
// height: 80,
child:
Expanded(
child: Stack(
children: <Widget>[
Positioned(
left: 20,
top: 12,
child: baseText('99%', 21, Color(0xffF25874),
bold: true)
),
Positioned(
left: 20,
top: 33,
// bottom: 12,
child: baseText('好评率', 12, Color(0xff666666),
bold: false),
),
Positioned(
left: 20,
top: 55,
// bottom: 12,
child: FiveStarView(3,5),
),
Positioned(
left: 20,
top: 98,
bottom: 12,
child: baseText('13679个', 21, Color(0xffF25874),
bold: true),
),
Positioned(
left: 20,
top: 112,
bottom: 12,
child: baseText('销量', 12, Color(0xff666666),
bold: false),
),
Positioned(
left: 20,
top: 132,
bottom: 12,
child: baseText('', 12, Color(0xff666666),
bold: false),
),
]
)
)
);
}
Widget planNormalEffectiveAttrsView(Groups groups) {
return Container(
color: Colors.green,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
child: Stack(
children: <Widget>[
titleView(),
Expanded (
child: Container(
margin: EdgeInsets.fromLTRB(0, 68, 0, 0),
child:
ListView.builder(
itemBuilder: (c, index) {
return planBaseAttrsView();
},
itemCount: 5,
)
)
)
]
)
)
]
)
);
}
Widget planBaseAttrsView() {
return Container(
color: Colors.red,
height: 80,
child: Row(
children: <Widget>[
Expanded(
flex:1,
child: planBaseAttrsLeftView()
),
Expanded(
flex: 1,
child: planBaseAttrsRightView()
)
]
)
);
}
Widget planBaseAttrsLeftView() {
return Container(
color: Colors.red,
height: 80,
child: Stack(
children: <Widget>[
Positioned(
right: 20,
top: 12,
child: baseText('嘻嘻嘻嘻嘻嘻', 14, Color(0xff3FB5AF),
bold: true)
),
Positioned(
right: 20,
// top: 12,
bottom: 12,
child: baseText('哈哈哈哈', 12, Color(0xff666666),
bold: false),
),
]
)
);
}
Widget planBaseAttrsRightView() {
return Container(
color: Colors.red,
height: 80,
child: Stack(
children: <Widget>[
Positioned(
left: 20,
top: 12,
child: baseText('嘻嘻嘻嘻嘻嘻', 14, Color(0xffF25874),
bold: true)
),
Positioned(
left: 20,
// top: 12,
bottom: 12,
child: baseText('哈哈哈哈', 12, Color(0xff666666),
bold: false),
),
]
)
);
}
}
\ No newline at end of file
...@@ -6,11 +6,11 @@ import 'package:flutter_common/Annotations/anno/Get.dart'; ...@@ -6,11 +6,11 @@ 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/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/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';
@ServiceCenter() @ServiceCenter()
abstract class ClueApi { abstract class ClueApi {
@Get("/api/janus/plans/plan_detail") @Get("/api/janus/plans/plan_detail")
...@@ -24,6 +24,9 @@ abstract class ClueApi { ...@@ -24,6 +24,9 @@ abstract class ClueApi {
LevelOneFeedList getLevelOneList(@Query("plan_id") int plan_id, LevelOneFeedList getLevelOneList(@Query("plan_id") int plan_id,
@Query("tab_type") String tab_type, @Query("page") int page); @Query("tab_type") String tab_type, @Query("page") int page);
@Get("api/janus/plans/compare")
PlanCompareDetail getPlanCompareDetail(@Query("plan_ids") List<int> plan_ids);
@Get("api/janus/plans/options") @Get("api/janus/plans/options")
PlanBean getPlan(); PlanBean getPlan();
......
...@@ -17,6 +17,7 @@ import 'package:flutter/foundation.dart'; ...@@ -17,6 +17,7 @@ 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/PlansCompareFeed.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlansCompareFeed.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/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';
...@@ -83,6 +84,20 @@ class ClueApiImpl { ...@@ -83,6 +84,20 @@ class ClueApiImpl {
}); });
} }
Stream<PlanCompareDetail> getPlanCompareDetail(Dio _dio, List<int> plan_ids) {
return Stream.fromFuture(get(_dio, 'api/janus/plans/compare', data: {
'plan_ids': plan_ids,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parsePlanCompareDetail, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
Stream<PlanBean> getPlan( Stream<PlanBean> getPlan(
Dio _dio, Dio _dio,
) { ) {
...@@ -273,6 +288,10 @@ LevelOneFeedList parseLevelOneFeedList(String value) { ...@@ -273,6 +288,10 @@ LevelOneFeedList parseLevelOneFeedList(String value) {
return LevelOneFeedList.fromJson(json.decode(value)); return LevelOneFeedList.fromJson(json.decode(value));
} }
PlanCompareDetail parsePlanCompareDetail(String value) {
return PlanCompareDetail.fromJson(json.decode(value));
}
PlanBean parsePlanBean(String value) { PlanBean parsePlanBean(String value) {
return PlanBean.fromJson(json.decode(value)); return PlanBean.fromJson(json.decode(value));
} }
......
/*
* @Author: zx
* @Date: 2020-06-30 19:31:32
* @Last Modified by: zx
* @Last Modified time: 2020-07-01 20:31:42
*/
import 'dart:convert';
class PlanCompareDetail {
int error;
String message;
Null extra;
Null errorExtra;
UserType userType;
Data data;
PlanCompareDetail({this.error, this.message, this.extra, this.errorExtra, this.userType, this.data});
PlanCompareDetail.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<PlansInfo> plansInfo;
List<Groups> groups;
Data({this.plansInfo, this.groups});
Data.fromJson(Map<String, dynamic> json) {
if (json['plans_info'] != null) {
plansInfo = new List<PlansInfo>();
json['plans_info'].forEach((v) { plansInfo.add(new PlansInfo.fromJson(v)); });
}
if (json['groups'] != null) {
groups = new List<Groups>();
json['groups'].forEach((v) { groups.add(new Groups.fromJson(v)); });
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.plansInfo != null) {
data['plans_info'] = this.plansInfo.map((v) => v.toJson()).toList();
}
if (this.groups != null) {
data['groups'] = this.groups.map((v) => v.toJson()).toList();
}
return data;
}
}
class PlansInfo {
int planId;
String planName;
String minPrice;
String maxPrice;
PlansInfo({this.planId, this.planName, this.minPrice, this.maxPrice});
PlansInfo.fromJson(Map<String, dynamic> json) {
planId = json['plan_id'];
planName = json['plan_name'];
minPrice = json['min_price'];
maxPrice = json['max_price'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['plan_id'] = this.planId;
data['plan_name'] = this.planName;
data['min_price'] = this.minPrice;
data['max_price'] = this.maxPrice;
return data;
}
}
class Groups {
String groupType;
String groupName;
List<Plans> plans;
Groups({this.groupType, this.groupName, this.plans});
Groups.fromJson(Map<String, dynamic> json) {
groupType = json['group_type'];
groupName = json['group_name'];
if (json['plans'] != null) {
plans = new List<Plans>();
json['plans'].forEach((v) { plans.add(new Plans.fromJson(v)); });
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['group_type'] = this.groupType;
data['group_name'] = this.groupName;
if (this.plans != null) {
data['plans'] = this.plans.map((v) => v.toJson()).toList();
}
return data;
}
}
class Plans {
int planId;
String positiveRate;
String salesCount;
List<Attrs> attrs;
Plans({this.planId, this.positiveRate, this.salesCount, this.attrs});
Plans.fromJson(Map<String, dynamic> json) {
planId = json['plan_id'];
positiveRate = json['positive_rate'];
salesCount = json['sales_count'];
if (json['attrs'] != null) {
attrs = new List<Attrs>();
json['attrs'].forEach((v) { attrs.add(new Attrs.fromJson(v)); });
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['plan_id'] = this.planId;
data['positive_rate'] = this.positiveRate;
data['sales_count'] = this.salesCount;
if (this.attrs != null) {
data['attrs'] = this.attrs.map((v) => v.toJson()).toList();
}
return data;
}
}
class Attrs {
String attrName;
String attrValue;
Attrs({this.attrName, this.attrValue});
Attrs.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;
}
}
...@@ -31,10 +31,12 @@ class TestState extends BaseState<TestPage> { ...@@ -31,10 +31,12 @@ class TestState extends BaseState<TestPage> {
list.add(listItem("方案页面", () { list.add(listItem("方案页面", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getPlanPage()); JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getPlanPage());
})); }));
list.add(listItem("对比详情页", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getPlanCompareDetailPage());
}));
list.add(listItem("项目说明", () { list.add(listItem("项目说明", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getProjectDetailsPage()); JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getProjectDetailsPage());
})); }));
return list; return list;
} }
......
...@@ -6,7 +6,7 @@ import 'package:flutter_common/Annotations/anno/RouterCenter.dart'; ...@@ -6,7 +6,7 @@ import 'package:flutter_common/Annotations/anno/RouterCenter.dart';
import 'package:flutter_common/commonModel/util/WindowUtil.dart'; import 'package:flutter_common/commonModel/util/WindowUtil.dart';
import 'package:gm_flutter/main.mark.dart'; import 'package:gm_flutter/main.mark.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart';
import 'DemoPage.dart'; import 'DemoPage.dart';
import 'DemoPage1.dart'; import 'DemoPage1.dart';
import 'commonModel/base/BaseComponent.dart'; import 'commonModel/base/BaseComponent.dart';
......
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