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
074d8756
Commit
074d8756
authored
Jul 01, 2020
by
朱璇
Browse files
Options
Browse Files
Download
Plain Diff
conflict fix
parents
331257d4
f50eb013
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
962 additions
and
35 deletions
+962
-35
progress_inner.png
assets/progress_inner.png
+0
-0
ClueRouter.dart
lib/ClueModel/ClueRouter.dart
+8
-7
ClueRouterImpl.dart
lib/ClueModel/ClueRouterImpl.dart
+12
-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
+71
-0
ProjectDetailsModel.dart
lib/ClueModel/page/ProjectDetails/ProjectDetailsModel.dart
+39
-0
ProjectDetailsPage.dart
lib/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart
+69
-0
FilterView.dart
lib/ClueModel/page/plan/FilterView.dart
+9
-0
PlanProgressBar.dart
lib/ClueModel/page/plan/PlanProgressBar.dart
+176
-0
ClueApi.dart
lib/ClueModel/server/api/ClueApi.dart
+10
-1
ClueApi.serv.dart
lib/ClueModel/server/api/ClueApi.serv.dart
+40
-0
PlanBean.dart
lib/ClueModel/server/entity/PlanBean.dart
+6
-7
PlansCompareFeed.dart
lib/ClueModel/server/entity/PlansCompareFeed.dart
+114
-0
ProjectDetailsItem.dart
lib/ClueModel/server/entity/ProjectDetailsItem.dart
+115
-0
TestPage.dart
lib/MainRouter/page/test/TestPage.dart
+3
-0
BaseComponent.dart
lib/commonModel/base/BaseComponent.dart
+20
-11
main.dart
lib/main.dart
+7
-6
pubspec.lock
pubspec.lock
+3
-3
No files found.
assets/progress_inner.png
0 → 100644
View file @
074d8756
3.58 KB
lib/ClueModel/ClueRouter.dart
View file @
074d8756
...
...
@@ -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
}
lib/ClueModel/ClueRouterImpl.dart
View file @
074d8756
...
...
@@ -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
();
...
...
lib/ClueModel/page/PlansCompareFeed/PlansCompareFeedItemView.dart
0 → 100644
View file @
074d8756
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 @
074d8756
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 @
074d8756
/*
* @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
0 → 100644
View file @
074d8756
/*
* @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
,
);
}
}
lib/ClueModel/page/ProjectDetails/ProjectDetailsModel.dart
0 → 100644
View file @
074d8756
/*
* @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
();
}
}
lib/ClueModel/page/ProjectDetails/ProjectDetailsPage.dart
0 → 100644
View file @
074d8756
/*
* @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
]);
});
},
);
}
}
lib/ClueModel/page/plan/FilterView.dart
View file @
074d8756
...
...
@@ -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
,
...
...
lib/ClueModel/page/plan/PlanProgressBar.dart
0 → 100644
View file @
074d8756
/*
* @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"
,
),
),
)),
],
),
);
}
}
lib/ClueModel/server/api/ClueApi.dart
View file @
074d8756
...
...
@@ -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
();
...
...
lib/ClueModel/server/api/ClueApi.serv.dart
View file @
074d8756
...
...
@@ -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
));
}
...
...
lib/ClueModel/server/entity/PlanBean.dart
View file @
074d8756
...
...
@@ -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'
];
}
...
...
lib/ClueModel/server/entity/PlansCompareFeed.dart
0 → 100644
View file @
074d8756
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
0 → 100644
View file @
074d8756
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
;
}
}
lib/MainRouter/page/test/TestPage.dart
View file @
074d8756
...
...
@@ -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
;
}
...
...
lib/commonModel/base/BaseComponent.dart
View file @
074d8756
...
...
@@ -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
...
...
lib/main.dart
View file @
074d8756
...
...
@@ -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
(
...
...
pubspec.lock
View file @
074d8756
...
...
@@ -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:
...
...
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