Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
gm_flutter
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
林生雨
gm_flutter
Commits
5ea361b6
Commit
5ea361b6
authored
Jul 01, 2020
by
朱翠翠
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
方案页面
parent
71f14443
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
483 additions
and
34 deletions
+483
-34
ClueRouter.dart
lib/ClueModel/ClueRouter.dart
+2
-0
ClueRouterImpl.dart
lib/ClueModel/ClueRouterImpl.dart
+6
-0
PlansCompareFeedItemView.dart
...Model/page/PlansCompareFeed/PlansCompareFeedItemView.dart
+143
-0
PlansCompareFeedModel.dart
...lueModel/page/PlansCompareFeed/PlansCompareFeedModel.dart
+29
-0
PlansCompareFeedPage.dart
...ClueModel/page/PlansCompareFeed/PlansCompareFeedPage.dart
+88
-0
ProjectDetailsItemView.dart
...ClueModel/page/ProjectDetails/ProjectDetailsItemView.dart
+2
-2
ProjectDetailsModel.dart
lib/ClueModel/page/ProjectDetails/ProjectDetailsModel.dart
+8
-5
ProjectDetailsPage.dart
lib/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart
+4
-3
ClueApi.dart
lib/ClueModel/server/api/ClueApi.dart
+6
-1
ClueApi.serv.dart
lib/ClueModel/server/api/ClueApi.serv.dart
+26
-7
PlansCompareFeed.dart
lib/ClueModel/server/entity/PlansCompareFeed.dart
+114
-0
ProjectDetailsItem.dart
lib/ClueModel/server/entity/ProjectDetailsItem.dart
+55
-16
No files found.
lib/ClueModel/ClueRouter.dart
View file @
5ea361b6
...
...
@@ -12,5 +12,7 @@ import 'package:gm_flutter/ClueModel/ClueRouterImpl.dart';
abstract
class
ClueRouter
implements
RouterBaser
{
Widget
getProjectDetailsPage
();
Widget
getPlansCompareFeed
();
Widget
getLevelOnePage
();
}
lib/ClueModel/ClueRouterImpl.dart
View file @
5ea361b6
...
...
@@ -4,6 +4,7 @@
**/
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'
;
...
...
@@ -17,4 +18,9 @@ class ClueRouterImpl implements ClueRouter {
Widget
getLevelOnePage
()
{
return
LevelOnePage
();
}
@override
Widget
getPlansCompareFeed
()
{
return
PlansCompareFeedPage
();
}
}
lib/ClueModel/page/PlansCompareFeed/PlansCompareFeedItemView.dart
0 → 100644
View file @
5ea361b6
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
,
)
],
)
],
),
))
],
),
);
}
}
lib/ClueModel/page/PlansCompareFeed/PlansCompareFeedModel.dart
0 → 100644
View file @
5ea361b6
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
();
}
}
lib/ClueModel/page/PlansCompareFeed/PlansCompareFeedPage.dart
0 → 100644
View file @
5ea361b6
/*
* @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
);
},
);
}
}
lib/ClueModel/page/ProjectDetails/ProjectDetailsItemView.dart
View file @
5ea361b6
...
...
@@ -47,14 +47,14 @@ class ProjectDetailsItemView extends StatelessWidget {
child:
Row
(
children:
<
Widget
>[
Text
(
attrs
.
n
ame
,
attrs
.
attrN
ame
,
style:
TextStyle
(
color:
Color
(
0xFF999999
),
fontSize:
13.0
,
),
),
Text
(
attrs
.
v
alue
,
attrs
.
attrV
alue
,
style:
TextStyle
(
color:
Color
(
0xFF282828
),
fontSize:
14.0
,
...
...
lib/ClueModel/page/ProjectDetails/ProjectDetailsModel.dart
View file @
5ea361b6
...
...
@@ -8,6 +8,7 @@ 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'
;
...
...
@@ -19,13 +20,15 @@ class ProjectDetailsModel extends BaseModel {
ClueApiImpl
.
getInstance
()
.
getProjectDetails
(
DioUtil
.
getInstance
().
getDio
(),
123
)
.
listen
((
event
)
{
// if(event.error==0){
// event.data;
//
liveData.notifyView(event);
//
}
print
(
event
);
if
(
event
.
error
==
0
)
{
liveData
.
notifyView
(
event
);
}
})
.
addToDispose
(
rxDispose
)
.
onError
((
err
)
{});
.
onError
((
err
)
{
PrintUtil
.
printBug
(
err
);
});
}
@override
...
...
lib/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart
View file @
5ea361b6
...
...
@@ -23,6 +23,7 @@ class ProjectDetailsState extends BaseState<ProjectDetailsPage> {
@override
void
initState
()
{
super
.
initState
();
_model
.
init
();
}
@override
...
...
@@ -52,13 +53,13 @@ class ProjectDetailsState extends BaseState<ProjectDetailsPage> {
initialData:
ProjectDetailsItem
(),
builder:
(
c
,
data
)
{
ProjectDetailsItem
item
=
data
.
data
;
if
(
data
==
null
||
item
==
null
||
item
.
groups
==
null
)
{
if
(
item
==
null
||
item
.
data
==
null
||
item
.
data
.
groups
==
null
)
{
return
loadingItem
();
}
return
ListView
.
builder
(
itemCount:
item
.
groups
.
length
,
itemCount:
item
.
data
.
groups
.
length
,
itemBuilder:
(
BuildContext
context
,
int
position
)
{
return
ProjectDetailsItemView
(
item
.
groups
[
position
]);
return
ProjectDetailsItemView
(
item
.
data
.
groups
[
position
]);
});
},
);
...
...
lib/ClueModel/server/api/ClueApi.dart
View file @
5ea361b6
...
...
@@ -6,13 +6,18 @@ import 'package:flutter_common/Annotations/anno/Get.dart';
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/PlansCompareFeed.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/ProjectDetailsItem.dart'
;
@ServiceCenter
()
abstract
class
ClueApi
{
@Get
(
"/api/janus/plans/detail"
)
@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
);
...
...
lib/ClueModel/server/api/ClueApi.serv.dart
View file @
5ea361b6
...
...
@@ -15,7 +15,7 @@ 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'
;
const
bool
inProduction
=
const
bool
.
fromEnvironment
(
"dart.vm.product"
);
...
...
@@ -35,8 +35,7 @@ class ClueApiImpl {
}
Stream
<
ProjectDetailsItem
>
getProjectDetails
(
Dio
_dio
,
int
plan_id
)
{
return
Stream
.
fromFuture
(
get
(
_dio
,
'/api/janus/plans/<:plan_id>/detail'
,
data:
{
return
Stream
.
fromFuture
(
get
(
_dio
,
'/api/janus/plans/plan_detail'
,
data:
{
'plan_id'
:
plan_id
,
})).
flatMap
((
value
)
{
if
(
value
!=
null
&&
...
...
@@ -49,6 +48,22 @@ class ClueApiImpl {
});
}
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:
{
...
...
@@ -203,10 +218,14 @@ class ClueApiImpl {
}
}
LevelOneFeedList
parseLevelOneFeedList
(
String
value
)
{
return
LevelOneFeedList
.
fromJson
(
json
.
decode
(
value
));
}
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
));
}
lib/ClueModel/server/entity/PlansCompareFeed.dart
0 → 100644
View file @
5ea361b6
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
;
}
}
lib/ClueModel/server/entity/ProjectDetailsItem.dart
View file @
5ea361b6
import
'package:flutter_common/Annotations/anno/ServerEntity.dart'
;
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
;
ProjectDetailsItem
({
this
.
name
,
this
.
groups
});
Data
({
this
.
id
,
this
.
name
,
this
.
groups
});
ProjectDetailsItem
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
Data
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
id
=
json
[
'id'
];
name
=
json
[
'name'
];
if
(
json
[
'groups'
]
!=
null
)
{
groups
=
new
List
<
Groups
>();
...
...
@@ -18,6 +57,7 @@ class ProjectDetailsItem {
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
();
...
...
@@ -30,7 +70,7 @@ class Groups {
String
name
;
List
<
Attrs
>
attrs
;
Groups
(
String
s
,
List
<
Attrs
>
list
,
{
this
.
name
,
this
.
attrs
});
Groups
({
this
.
name
,
this
.
attrs
});
Groups
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
name
=
json
[
'name'
];
...
...
@@ -53,24 +93,23 @@ class Groups {
}
class
Attrs
{
int
i
d
;
String
n
ame
;
String
v
alue
;
int
attrI
d
;
String
attrN
ame
;
String
attrV
alue
;
Attrs
({
this
.
id
,
this
.
name
,
this
.
v
alue
});
Attrs
({
this
.
attrId
,
this
.
attrName
,
this
.
attrV
alue
});
Attrs
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
id
=
json
[
'
id'
];
name
=
json
[
'
name'
];
value
=
json
[
'
value'
];
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
[
'
id'
]
=
this
.
i
d
;
data
[
'
name'
]
=
this
.
n
ame
;
data
[
'
value'
]
=
this
.
v
alue
;
data
[
'
attr_id'
]
=
this
.
attrI
d
;
data
[
'
attr_name'
]
=
this
.
attrN
ame
;
data
[
'
attr_value'
]
=
this
.
attrV
alue
;
return
data
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment