Commit 074d8756 authored by 朱璇's avatar 朱璇

conflict fix

parents 331257d4 f50eb013
......@@ -3,17 +3,19 @@
* @date 2020/6/24
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_common/Annotations/RouterBaser.dart';
import 'package:flutter_common/Annotations/anno/Router.dart';
import 'package:flutter_common/Annotations/anno/RouterCenter.dart';
import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart';
@Router("ClueRouter",ClueRouterImpl,true)
abstract class ClueRouter implements RouterBaser{
@Router("ClueRouter", ClueRouterImpl, true)
abstract class ClueRouter implements RouterBaser {
Widget getProjectDetailsPage();
Widget getPlansCompareFeed();
Widget getLevelOnePage();
Widget getPlanPage();
Widget getPlanPage();
Widget getPlanCompareDetailPage();
}
\ No newline at end of file
}
......@@ -4,16 +4,28 @@
**/
import 'package:flutter/src/widgets/framework.dart';
import 'package:gm_flutter/ClueModel/ClueRouter.dart';
import 'package:gm_flutter/ClueModel/page/PlansCompareFeed/PlansCompareFeedPage.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/plan/PlanPage.dart';
import 'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart';
class ClueRouterImpl implements ClueRouter {
@override
Widget getProjectDetailsPage() {
return ProjectDetailsPage();
}
@override
Widget getLevelOnePage() {
return LevelOnePage();
}
@override
Widget getPlansCompareFeed() {
return PlansCompareFeedPage();
}
@override
Widget getPlanPage() {
return PlanPage();
......
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlansCompareFeed.dart';
class PlansCompareFeedItemView extends StatelessWidget {
Plans plan;
int groupValue = 1;
PlansCompareFeedItemView(this.plan);
@override
Widget build(BuildContext context) {
return Container(child: getItem());
}
getItem() {
if (plan.planType == 1) {
return getFirstLevelItem();
} else {
return getSecondLevelItem();
}
}
getFirstLevelItem() {
Container(
margin: EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Radio(
value: 1,
groupValue: groupValue,
onChanged: (value) {
groupValue = value;
}),
ClipRRect(
borderRadius: BorderRadius.circular(2.0),
child: Image.network(
plan.projectImage,
width: 50,
height: 50,
fit: BoxFit.fill,
),
),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 8.0),
height: 50,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
Text(
plan.name,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
color: Color(0xFF282828)),
maxLines: 1,
),
Text(
"好评率 ",
style: TextStyle(fontSize: 11, color: Color(0xFF282828)),
maxLines: 1,
),
Text(
plan.positiveRate,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
color: Color(0xFFFF5963)),
maxLines: 1,
),
],
),
Row(
children: <Widget>[
Text(
'¥${plan.minPrice}-${plan.maxPrice})',
style: TextStyle(fontSize: 13, color: Color(0xFFFF5963)),
),
Text(
"销量${plan.salesCount}",
style: TextStyle(fontSize: 11, color: Color(0xFF282828)),
maxLines: 1,
)
],
)
],
),
))
],
),
);
}
getSecondLevelItem() {
Container(
margin: EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Radio(
value: 1,
groupValue: groupValue,
onChanged: (value) {
groupValue = value;
}),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 8.0),
height: 50,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
plan.name,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
color: Color(0xFF282828)),
maxLines: 1,
),
Row(
children: <Widget>[
Text(
'¥${plan.minPrice}-${plan.maxPrice})',
style: TextStyle(fontSize: 13, color: Color(0xFFFF5963)),
),
Text(
"指导价:¥${plan.guidePrice}",
style: TextStyle(fontSize: 11, color: Color(0xFF282828)),
maxLines: 1,
)
],
)
],
),
))
],
),
);
}
}
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/PlansCompareFeed.dart';
import 'package:gm_flutter/commonModel/net/DioUtil.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
class PlansCompareFeedModel extends BaseModel {
LiveData<PlansCompareFeed> liveData = LiveData();
RxDispose rxDispose = RxDispose();
void init() {
ClueApiImpl.getInstance()
.getPlansCompareFeed(DioUtil.getInstance().getDio(), 123, 1)
.listen((event) {
if (event.error == 0) {
liveData.notifyView(event);
}
})
.addToDispose(rxDispose)
.onError((err) {});
}
@override
void dispose() {
liveData.dispost();
rxDispose.dispose();
}
}
/*
* @author zcc
* @date 2020-07-01
* 方案对比
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/page/PlansCompareFeed/PlansCompareFeedModel.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlansCompareFeed.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.dart';
import 'PlansCompareFeedItemView.dart';
class PlansCompareFeedPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => PlansCompareFeedState();
}
class PlansCompareFeedState extends BaseState<PlansCompareFeedPage> {
PlansCompareFeedModel _model = new PlansCompareFeedModel();
@override
void initState() {
super.initState();
_model.init();
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget buildItem(BuildContext context) {}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("方案对比"),
),
body: Center(
child: getBody(),
),
);
}
getList(List<Plans> plans) {
return Stack(alignment: Alignment.bottomCenter, //指定未定位或部分定位widget的对齐方式
children: <Widget>[
ListView.builder(
itemCount: plans.length,
itemBuilder: (BuildContext context, int position) {
return PlansCompareFeedItemView(plans[position]);
}),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {},
child: Container(
margin:
EdgeInsets.only(left: 15, right: 15, top: 7.5, bottom: 7.5),
width: double.maxFinite,
height: 40,
decoration: BoxDecoration(
color: Color(0xff51CDC7),
borderRadius: BorderRadius.circular(20)),
alignment: Alignment.center,
child: baseText("对比", 14, Colors.white, bold: true),
))
]);
}
getBody() {
return StreamBuilder(
stream: _model.liveData.stream,
initialData: PlansCompareFeed(),
builder: (c, data) {
PlansCompareFeed item = data.data;
if (item == null || item.data == null || item.data.plans == null) {
return loadingItem();
}
return getList(item.data.plans);
},
);
}
}
/*
* @author zcc
* @date 2020-07-01
* 项目说明
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart';
class ProjectDetailsItemView extends StatelessWidget {
Groups listData;
ProjectDetailsItemView(this.listData);
@override
Widget build(BuildContext context) {
List<Widget> tiles = [];
for (var item in listData.attrs) {
tiles.add(getItem(item));
}
var row = Row(
children: <Widget>[
Container(
padding: EdgeInsets.only(top: 8.0, bottom: 8.0, left: 20),
child: Text(
listData.name,
style: TextStyle(
color: Color(0xFF000000),
fontSize: 15.0,
),
),
),
Column(
children: tiles,
)
],
);
return Container(
margin: EdgeInsets.only(bottom: 5, left: 20),
child: row,
);
}
getItem(Attrs attrs) {
var row = Container(
margin: EdgeInsets.only(bottom: 25),
child: Row(
children: <Widget>[
Text(
attrs.attrName,
style: TextStyle(
color: Color(0xFF999999),
fontSize: 13.0,
),
),
Text(
attrs.attrValue,
style: TextStyle(
color: Color(0xFF282828),
fontSize: 14.0,
),
maxLines: 1,
),
],
),
);
return Container(
child: row,
);
}
}
/*
* @author zcc
* @date 2020-07-01
* 项目说明
**/
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/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import '../../server/entity/ProjectDetailsItem.dart';
class ProjectDetailsModel extends BaseModel {
LiveData<ProjectDetailsItem> liveData = LiveData();
RxDispose rxDispose = RxDispose();
void init() {
ClueApiImpl.getInstance()
.getProjectDetails(DioUtil.getInstance().getDio(), 123)
.listen((event) {
print(event);
if (event.error == 0) {
liveData.notifyView(event);
}
})
.addToDispose(rxDispose)
.onError((err) {
PrintUtil.printBug(err);
});
}
@override
void dispose() {
liveData.dispost();
rxDispose.dispose();
}
}
/*
* @author zcc
* @date 2020-07-01
* 项目说明
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/page/ProjectDetails/ProjectDetailsItemView.dart';
import 'package:gm_flutter/ClueModel/page/ProjectDetails/ProjectDetailsModel.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.dart';
import '../../server/entity/ProjectDetailsItem.dart';
class ProjectDetailsPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => ProjectDetailsState();
}
class ProjectDetailsState extends BaseState<ProjectDetailsPage> {
ProjectDetailsModel _model = new ProjectDetailsModel();
@override
void initState() {
super.initState();
_model.init();
}
@override
void dispose() {
_model.dispose();
super.dispose();
}
@override
Widget buildItem(BuildContext context) {}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: baseAppBar(title: "项目说明",
centerTitle: true,
backClick: (){
Navigator.pop(context);
}),
body: Center(
child: getBody(),
),
);
}
getBody() {
return StreamBuilder(
stream: _model.liveData.stream,
initialData: ProjectDetailsItem(),
builder: (c, data) {
ProjectDetailsItem item = data.data;
if (item == null || item.data == null || item.data.groups == null) {
return loadingItem();
}
return ListView.builder(
itemCount: item.data.groups.length,
itemBuilder: (BuildContext context, int position) {
return ProjectDetailsItemView(item.data.groups[position]);
});
},
);
}
}
......@@ -4,6 +4,7 @@
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/page/plan/PlanProgressBar.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/commonModel/util/DartUtil.dart';
......@@ -22,6 +23,14 @@ class FilterView extends StatelessWidget {
height: 186,
child: Stack(
children: <Widget>[
Positioned(
bottom: 74.5,
left: 15,
child: Container(
width: MediaQuery.of(context).size.width - 30,
child: PlanProgressBar(0, 5, 0, 10,padding: 15,),
),
),
Positioned(
top: 54.5,
right: 15,
......
/*
* @author lsy
* @date 2020/7/1
**/
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
class PlanProgressBar extends StatefulWidget {
int low;
int high;
int maxlow;
int maxHigh;
int padding;
PlanProgressBar(this.low, this.high, this.maxlow, this.maxHigh,
{this.padding});
@override
State<StatefulWidget> createState() => PlanProgressBarState();
}
class PlanProgressBarState extends State<PlanProgressBar> {
double distance;
double leftStarPosPercent;
double leftPosTempPercent;
double rightStarPosPercent;
double rightPosTempPercent;
double leftDowPos;
double rightDowPos;
double scrollDistance;
double leftPos;
double textLeft = -1;
bool isLeftMove = true;
@override
void initState() {
super.initState();
distance = widget.maxHigh - widget.maxlow - 0.0;
leftStarPosPercent = (widget.low / distance);
leftPosTempPercent = leftStarPosPercent;
rightStarPosPercent = (widget.high / distance);
rightPosTempPercent = rightStarPosPercent;
}
@override
Widget build(BuildContext context) {
double totle = MediaQuery.of(context).size.width - widget.padding * 2 - 8;
scrollDistance = 0.05;
double textL = textLeft * totle - 67.5 / 2 + 9;
if (textL < 0) {
textL = 0;
} else if (textL + 67.5 > totle) {
textL = totle - 67.5;
}
return Container(
width: double.maxFinite,
height: 65,
child: Stack(
children: <Widget>[
Positioned(
bottom: 7.5,
left: 4,
child: Container(
width: totle,
height: 4,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: Color(0xffD5D5D5)),
),
),
Positioned(
left: leftPosTempPercent * totle + 5,
bottom: 7.5,
child: Container(
height: 4,
width: (rightPosTempPercent - leftPosTempPercent) * totle,
color: Color(0xff51CDC7),
),
),
Positioned(
left: textL,
bottom: 23,
child: Visibility(
visible: textLeft >= 0,
child: Container(
width: 67.5,
height: 42,
color: Color(0x66000000),
alignment: Alignment.center,
child: baseText(
"${(widget.maxlow + (isLeftMove?leftPosTempPercent:rightPosTempPercent+0.03) * distance).toInt()}",
13,
Colors.white),
),
),
),
Positioned(
bottom: 0,
left: leftPosTempPercent * totle,
child: Listener(
onPointerDown: (p) {
leftDowPos = p.localPosition.dx;
isLeftMove = true;
},
onPointerMove: (p) {
var d = p.localPosition.dx - leftDowPos;
leftPosTempPercent = leftStarPosPercent + (d / totle);
if (leftPosTempPercent < 0.0) {
leftPosTempPercent = 0;
} else if (leftPosTempPercent >
rightPosTempPercent - scrollDistance) {
leftPosTempPercent = rightPosTempPercent - scrollDistance;
}
textLeft = leftPosTempPercent;
setState(() {});
},
onPointerUp: (p) {
textLeft = -1;
leftStarPosPercent = leftPosTempPercent;
setState(() {});
},
child: Container(
width: 19,
height: 19,
alignment: Alignment.centerLeft,
child: Image.asset(
"assets/progress_inner.png",
),
),
)),
Positioned(
bottom: 0,
left: rightPosTempPercent * totle,
child: Listener(
onPointerDown: (p) {
rightDowPos = p.localPosition.dx;
isLeftMove = false;
},
onPointerMove: (p) {
var d = p.localPosition.dx - rightDowPos;
print("D ${d}");
rightPosTempPercent = rightStarPosPercent + (d / totle);
if (rightPosTempPercent <
leftPosTempPercent + scrollDistance) {
rightPosTempPercent = leftPosTempPercent + scrollDistance;
} else if (rightPosTempPercent > 1.0 - 0.03) {
rightPosTempPercent = 1.0 - 0.03;
}
textLeft = rightPosTempPercent;
setState(() {});
},
onPointerUp: (p) {
textLeft = -1;
rightStarPosPercent = rightPosTempPercent;
setState(() {});
},
child: Container(
width: 19,
height: 19,
alignment: Alignment.centerLeft,
child: Image.asset(
"assets/progress_inner.png",
),
),
)),
],
),
);
}
}
......@@ -7,17 +7,26 @@ import 'package:flutter_common/Annotations/anno/Query.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/PlanCompareDetail.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/PlanBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart';
@ServiceCenter()
abstract class ClueApi {
@Get("/api/janus/plans/plan_detail")
ProjectDetailsItem getProjectDetails(@Query("plan_id") int plan_id);
@Get("/api/janus/plans/compare_feed")
PlansCompareFeed getPlansCompareFeed(
@Query("plan_id") int plan_id, @Query("plan_type") int plan_type);
@Get("api/janus/plans/plan_feed")
LevelOneFeedList getLevelOneList(@Query("plan_id") int plan_id,
@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")
PlanBean getPlan();
......
......@@ -14,6 +14,8 @@ import 'package:dio/dio.dart';
import 'package:flutter/foundation.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/LevelOneFeedList.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanBean.dart';
......@@ -35,6 +37,36 @@ class ClueApiImpl {
return _instance;
}
Stream<ProjectDetailsItem> getProjectDetails(Dio _dio, int plan_id) {
return Stream.fromFuture(get(_dio, '/api/janus/plans/plan_detail', data: {
'plan_id': plan_id,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parseProjectDetailsItem, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
Stream<PlansCompareFeed> getPlansCompareFeed(
Dio _dio, int plan_id, int plan_type) {
return Stream.fromFuture(get(_dio, '/api/janus/plans/compare_feed', data: {
'plan_id': plan_id,
'plan_type': plan_type,
})).flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Stream.fromFuture(
compute(parsePlansCompareFeed, value.toString()));
} else {
throw Exception("--未知网络错误--");
}
});
}
Stream<LevelOneFeedList> getLevelOneList(
Dio _dio, int plan_id, String tab_type, int page) {
return Stream.fromFuture(get(_dio, 'api/janus/plans/plan_feed', data: {
......@@ -244,6 +276,14 @@ class ClueApiImpl {
}
}
ProjectDetailsItem parseProjectDetailsItem(String value) {
return ProjectDetailsItem.fromJson(json.decode(value));
}
PlansCompareFeed parsePlansCompareFeed(String value) {
return PlansCompareFeed.fromJson(json.decode(value));
}
LevelOneFeedList parseLevelOneFeedList(String value) {
return LevelOneFeedList.fromJson(json.decode(value));
}
......
......@@ -5,8 +5,8 @@
class PlanBean {
int error;
String message;
Null extra;
Null errorExtra;
String extra;
String errorExtra;
UserType userType;
Data data;
......@@ -39,7 +39,6 @@ class PlanBean {
class UserType {
UserType();
UserType.fromJson(Map<String, dynamic> json) {
......@@ -177,14 +176,14 @@ class Groups {
class Cities {
String cityName;
int id;
String id;
String name;
Cities({this.cityName, this.id, this.name});
Cities.fromJson(Map<String, dynamic> json) {
cityName = json['city_name'];
id = json['id'];
id = json['id'].toString();
name = json['name'];
}
......@@ -205,7 +204,7 @@ class Tags {
Tags({this.id, this.subTags, this.name});
Tags.fromJson(Map<String, dynamic> json) {
id = json['id'];
id = json['id'].toString();
if (json['sub_tags'] != null) {
subTags = new List<SubTags>();
json['sub_tags'].forEach((v) { subTags.add(new SubTags.fromJson(v)); });
......@@ -231,7 +230,7 @@ class SubTags {
SubTags({this.id, this.name});
SubTags.fromJson(Map<String, dynamic> json) {
id = json['id'];
id = json['id'].toString();
name = json['name'];
}
......
class PlansCompareFeed {
int error;
String message;
String extra;
String errorExtra;
String userType;
Data data;
PlansCompareFeed(
{this.error,
this.message,
this.extra,
this.errorExtra,
this.userType,
this.data});
PlansCompareFeed.fromJson(Map<String, dynamic> json) {
error = json['error'];
message = json['message'];
extra = json['extra'];
errorExtra = json['error_extra'];
userType = json['user_type'];
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;
data['user_type'] = this.userType;
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class Data {
List<Plans> plans;
Data({this.plans});
Data.fromJson(Map<String, dynamic> json) {
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>();
if (this.plans != null) {
data['plans'] = this.plans.map((v) => v.toJson()).toList();
}
return data;
}
}
class Plans {
int planId;
int planType;
String cardType;
String name;
String positiveRate;
String salesCount;
String minPrice;
String maxPrice;
String projectImage;
String guidePrice;
Plans(
{this.planId,
this.planType,
this.cardType,
this.name,
this.positiveRate,
this.salesCount,
this.minPrice,
this.maxPrice,
this.projectImage,
this.guidePrice});
Plans.fromJson(Map<String, dynamic> json) {
planId = json['plan_id'];
planType = json['plan_type'];
cardType = json['card_type'];
name = json['name'];
positiveRate = json['positive_rate'];
salesCount = json['sales_count'];
minPrice = json['min_price'];
maxPrice = json['max_price'];
projectImage = json['project_image'];
guidePrice = json['guide_price'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['plan_id'] = this.planId;
data['plan_type'] = this.planType;
data['card_type'] = this.cardType;
data['name'] = this.name;
data['positive_rate'] = this.positiveRate;
data['sales_count'] = this.salesCount;
data['min_price'] = this.minPrice;
data['max_price'] = this.maxPrice;
data['project_image'] = this.projectImage;
data['guide_price'] = this.guidePrice;
return data;
}
}
class ProjectDetailsItem {
int error;
String message;
String extra;
String errorExtra;
String userType;
Data data;
ProjectDetailsItem(
{this.error,
this.message,
this.extra,
this.errorExtra,
this.userType,
this.data});
ProjectDetailsItem.fromJson(Map<String, dynamic> json) {
error = json['error'];
message = json['message'];
extra = json['extra'];
errorExtra = json['error_extra'];
userType = json['user_type'];
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;
data['user_type'] = this.userType;
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class Data {
int id;
String name;
List<Groups> groups;
Data({this.id, this.name, this.groups});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
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>();
data['id'] = this.id;
data['name'] = this.name;
if (this.groups != null) {
data['groups'] = this.groups.map((v) => v.toJson()).toList();
}
return data;
}
}
class Groups {
String name;
List<Attrs> attrs;
Groups({this.name, this.attrs});
Groups.fromJson(Map<String, dynamic> json) {
name = json['name'];
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['name'] = this.name;
if (this.attrs != null) {
data['attrs'] = this.attrs.map((v) => v.toJson()).toList();
}
return data;
}
}
class Attrs {
int attrId;
String attrName;
String attrValue;
Attrs({this.attrId, this.attrName, this.attrValue});
Attrs.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;
}
}
......@@ -34,6 +34,9 @@ class TestState extends BaseState<TestPage> {
list.add(listItem("对比详情页", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getPlanCompareDetailPage());
}));
list.add(listItem("项目说明", () {
JumpUtil.jumpToPageRight(context, RouterCenterImpl().findClueRouter().getProjectDetailsPage());
}));
return list;
}
......
......@@ -113,18 +113,27 @@ Widget baseDivideWidth(double width, double padding) {
}
Widget loadingItem({bool needBackground = false}) {
// return
// Center(
// child: Container(
// width: 77,
// height: 77,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(8),
// color: needBackground ? Colors.black : Colors.transparent),
// alignment: Alignment.center,
// child: MyCupertinoActivityIndicator(
// backColor: needBackground ? Colors.white : Colors.black,
// ),
// ));
return Center(
child: Container(
width: 77,
height: 77,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: needBackground ? Colors.black : Colors.transparent),
alignment: Alignment.center,
child: MyCupertinoActivityIndicator(
backColor: needBackground ? Colors.white : Colors.black,
child: Container(
width: 80,
height: 80,
child: Lottie.asset("assets/smart_refresh_header.json",
repeat: true, reverse: false),
),
));
);
}
Widget netErrorItem() {}
......@@ -311,7 +320,7 @@ Widget baseRefreshView(RefreshController refreshController,
Widget normalRefreshHeader() {
return CustomHeader(
builder: (BuildContext context, RefreshStatus mode) {
Widget body=Container();
Widget body = Container();
// if (mode == RefreshStatus.idle) {
//
// } else
......
......@@ -4,15 +4,16 @@ import 'package:flutter/material.dart';
import 'package:flutter_boost/flutter_boost.dart';
import 'package:flutter_common/Annotations/anno/RouterCenter.dart';
import 'package:flutter_common/commonModel/util/WindowUtil.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.dart';
import 'package:gm_flutter/main.mark.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart';
import 'DemoPage.dart';
import 'DemoPage1.dart';
import 'commonModel/base/BaseComponent.dart';
import 'commonModel/base/BaseUtil.dart';
import 'commonModel/cache/CacheManager.dart';
import 'commonModel/nav/NavigationService.dart';
import 'main.mark.dart';
NavigationService navigationService;
......@@ -82,11 +83,11 @@ class MyApp extends State<MyAppWidget> {
home: isDebug
? RouterCenterImpl().findMainRouter().getTestPage()
: Container(
color: Colors.white,
child: Center(
child: loadingItem(),
),
));
color: Colors.white,
child: Center(
child: loadingItem(),
),
));
}
void _onRoutePushed(
......
......@@ -210,7 +210,7 @@ packages:
name: file
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.2.0"
version: "5.2.1"
fixnum:
dependency: transitive
description:
......@@ -474,7 +474,7 @@ packages:
name: permission_handler
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.0.1"
version: "5.0.1+1"
permission_handler_platform_interface:
dependency: transitive
description:
......@@ -544,7 +544,7 @@ packages:
name: pull_to_refresh
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.8"
version: "1.6.0"
quiver:
dependency: transitive
description:
......
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