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
26f0dd26
Commit
26f0dd26
authored
Jul 03, 2020
by
林生雨
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
commit
parent
42ecd946
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
500 additions
and
88 deletions
+500
-88
LevelOnePage.dart
lib/ClueModel/page/levelOne/LevelOnePage.dart
+3
-22
TopList.dart
lib/ClueModel/page/top/TopList.dart
+101
-0
TopListModel.dart
lib/ClueModel/page/top/TopListModel.dart
+68
-0
TopModel.dart
lib/ClueModel/page/top/TopModel.dart
+42
-2
TopPage.dart
lib/ClueModel/page/top/TopPage.dart
+73
-50
ClueApi.dart
lib/ClueModel/server/api/ClueApi.dart
+13
-8
ClueApi.serv.dart
lib/ClueModel/server/api/ClueApi.serv.dart
+18
-0
PlanBarBean.dart
lib/ClueModel/server/entity/PlanBarBean.dart
+99
-0
BaseComponent.dart
lib/commonModel/base/BaseComponent.dart
+73
-5
Pair.dart
lib/commonModel/bean/Pair.dart
+1
-0
pubspec.lock
pubspec.lock
+8
-1
pubspec.yaml
pubspec.yaml
+1
-0
No files found.
lib/ClueModel/page/levelOne/LevelOnePage.dart
View file @
26f0dd26
...
@@ -4,7 +4,6 @@
...
@@ -4,7 +4,6 @@
**/
**/
import
'dart:math'
;
import
'dart:math'
;
import
'package:cached_network_image/cached_network_image.dart'
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/gestures.dart'
;
import
'package:flutter/gestures.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
...
@@ -205,27 +204,9 @@ class LevelOneState extends BaseState<LevelOnePage>
...
@@ -205,27 +204,9 @@ class LevelOneState extends BaseState<LevelOnePage>
},
},
),
),
),
),
Positioned
(
baseSliverBack
(()
{
top:
49
,
Navigator
.
of
(
context
).
pop
();
left:
15
,
})
child:
GestureDetector
(
behavior:
HitTestBehavior
.
opaque
,
onTap:
()
{
//TODO
print
(
"TAP"
);
Navigator
.
pop
(
context
);
},
child:
Container
(
width:
30
,
height:
30
,
decoration:
BoxDecoration
(
color:
Color
(
0x99FFFFFF
),
shape:
BoxShape
.
circle
),
alignment:
Alignment
.
center
,
child:
Container
(
child:
Image
.
asset
(
"assets/left_arrow.png"
),
),
)),
)
],
],
),
),
),
),
...
...
lib/ClueModel/page/top/TopList.dart
0 → 100644
View file @
26f0dd26
/*
* @author lsy
* @date 2020/7/2
**/
import
'package:flutter/material.dart'
;
import
'package:gm_flutter/ClueModel/page/plan/PlanItem.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'
;
import
'package:gm_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'TopListModel.dart'
;
class
TopList
extends
StatefulWidget
{
final
int
id
;
double
topHeight
;
TopList
(
this
.
id
,
this
.
topHeight
);
@override
State
<
StatefulWidget
>
createState
()
=>
TopListState
();
}
class
TopListState
extends
State
<
TopList
>
{
RefreshController
refreshController
=
RefreshController
();
TopListModel
_model
=
TopListModel
();
@override
void
initState
()
{
super
.
initState
();
_model
.
getData
(
true
);
print
(
"
${this}
INIT"
);
}
@override
void
dispose
()
{
refreshController
.
dispose
();
_model
.
dispose
();
print
(
"
${this}
QUIT"
);
super
.
dispose
();
}
@override
Widget
build
(
BuildContext
context
)
{
return
baseStateView
(
MediaQuery
.
of
(
context
).
size
.
width
,
MediaQuery
.
of
(
context
).
size
.
height
,
_model
.
stateLive
,
home
(),
()
{
_model
.
getData
(
true
);
});
}
Widget
home
()
{
return
baseRefreshView
(
refreshController
,
()
{},
null
,
null
,
customScrollView:
CustomScrollView
(
// physics: NeverScrollableScrollPhysics(),
physics:
ClampingScrollPhysics
(),
// shrinkWrap: true,
slivers:
<
Widget
>[
SliverOverlapInjector
(
handle:
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
),
StreamBuilder
<
List
<
Plans
>>(
stream:
_model
.
datasLive
.
stream
,
initialData:
_model
.
datas
??
[],
builder:
(
c
,
data
)
{
print
(
"LLDATA
${data.data}
"
);
if
(
data
.
data
.
isEmpty
&&
_model
.
page
>
1
)
{
refreshController
.
loadNoData
();
}
else
{
refreshController
.
loadComplete
();
}
return
SliverFixedExtentList
(
itemExtent:
100
,
delegate:
SliverChildBuilderDelegate
(
(
BuildContext
context
,
int
index
)
{
return
PlanItem
(
_model
.
datas
[
index
]);
},
childCount:
_model
.
datas
.
length
,
),
);
},
),
StreamBuilder
<
List
<
Plans
>>(
stream:
_model
.
datasLive
.
stream
,
initialData:
_model
.
datas
??
[],
builder:
(
c
,
data
)
{
double
height
=
MediaQuery
.
of
(
context
).
size
.
height
-
40
-
widget
.
topHeight
-
100
*
_model
.
datas
.
length
;
return
SliverToBoxAdapter
(
child:
Container
(
height:
height
<
0
?
0
:
height
,
),
);
},
),
],
),
onLoading:
()
{
_model
.
loadMore
();
},
pullDown:
false
,
pullUp:
true
);
}
}
lib/ClueModel/page/top/TopListModel.dart
0 → 100644
View file @
26f0dd26
/*
* @author lsy
* @date 2020/7/3
**/
import
'package:flutter_common/commonModel/live/BaseModel.dart'
;
import
'package:flutter_common/commonModel/live/LiveData.dart'
;
import
'package:flutter_common/commonModel/toast/NativeToast.dart'
;
import
'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'
;
import
'package:gm_flutter/commonModel/GMBase.dart'
;
import
'package:gm_flutter/commonModel/bean/Pair.dart'
;
import
'package:gm_flutter/commonModel/rx/RxDispose.dart'
;
import
'package:gm_flutter/commonModel/util/PrintUtil.dart'
;
class
TopListModel
extends
BaseModel
{
LiveData
<
int
>
stateLive
=
LiveData
();
String
tagId
;
int
page
=
1
;
RxDispose
rxDispose
=
RxDispose
();
LiveData
<
List
<
Plans
>>
datasLive
=
LiveData
();
List
<
Plans
>
datas
=
[];
@override
void
dispose
()
{
rxDispose
.
dispose
();
stateLive
.
dispost
();
}
void
getData
(
bool
clear
)
{
if
(
clear
)
{
page
=
1
;
datas
.
clear
();
}
ClueApiImpl
.
getInstance
()
.
getPlanFeed
(
DioUtil
.
getInstance
().
getDio
(),
tagId
,
""
,
""
,
""
,
""
,
""
,
page
)
.
listen
((
event
)
{
if
(
event
.
error
==
0
)
{
if
(
event
.
data
.
plans
==
null
||
event
.
data
.
plans
.
isEmpty
)
{
if
(
page
==
1
)
{
stateLive
.
notifyView
(
EMPTY
);
}
else
{
datasLive
.
notifyView
([]);
}
}
else
{
datas
.
addAll
(
event
.
data
.
plans
);
datasLive
.
notifyView
(
datas
);
}
if
(
page
==
1
)
{
stateLive
.
notifyView
(
ENDLOADING
);
}
}
else
{
NativeToast
.
showNativeToast
(
event
.
message
);
stateLive
.
notifyView
(
FAIL
);
}
})
.
addToDispose
(
rxDispose
)
.
onError
((
err
)
{
PrintUtil
.
printBug
(
err
);
stateLive
.
notifyView
(
FAIL
);
});
}
void
loadMore
()
{
page
++;
getData
(
false
);
}
}
lib/ClueModel/page/top/TopModel.dart
View file @
26f0dd26
...
@@ -4,13 +4,32 @@
...
@@ -4,13 +4,32 @@
**/
**/
import
'package:flutter_common/commonModel/live/BaseModel.dart'
;
import
'package:flutter_common/commonModel/live/BaseModel.dart'
;
import
'package:flutter_common/commonModel/live/LiveData.dart'
;
import
'package:flutter_common/commonModel/live/LiveData.dart'
;
import
'package:flutter_common/commonModel/toast/NativeToast.dart'
;
import
'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanBarBean.dart'
;
import
'package:gm_flutter/commonModel/GMBase.dart'
;
import
'package:gm_flutter/commonModel/bean/Pair.dart'
;
import
'package:gm_flutter/commonModel/rx/RxDispose.dart'
;
import
'package:gm_flutter/commonModel/util/PrintUtil.dart'
;
class
TopModel
extends
BaseModel
{
class
TopModel
extends
BaseModel
{
int
tabIndex
=
0
;
int
tabIndex
=
0
;
List
<
String
>
tabs
=
[
"全部"
,
"眼部"
,
"自体脂肪"
,
"轮廓骨骼"
];
List
<
Tabs
>
tabs
=
[];
LiveData
<
String
>
titleLive
=
new
LiveData
();
LiveData
<
String
>
imageLive
=
LiveData
();
LiveData
<
int
>
stateLive
=
LiveData
();
RxDispose
rxDispose
=
RxDispose
();
String
rank_type
;
String
imageUrl
;
@override
@override
void
dispose
()
{}
void
dispose
()
{
rxDispose
.
dispose
();
titleLive
.
dispost
();
imageLive
.
dispost
();
stateLive
.
dispost
();
}
void
selectTab
(
int
index
)
{
void
selectTab
(
int
index
)
{
if
(
tabIndex
==
index
)
{
if
(
tabIndex
==
index
)
{
...
@@ -18,4 +37,25 @@ class TopModel extends BaseModel {
...
@@ -18,4 +37,25 @@ class TopModel extends BaseModel {
}
}
tabIndex
=
index
;
tabIndex
=
index
;
}
}
void
init
(
Function
(
int
size
)
back
)
{
ClueApiImpl
.
getInstance
()
.
getPlanBar
(
DioUtil
.
getInstance
().
getDio
(),
rank_type
)
.
listen
((
event
)
{
if
(
event
.
error
==
0
)
{
stateLive
.
notifyView
(
ENDLOADING
);
imageUrl
=
event
.
data
.
bannerImage
;
tabs
=
event
.
data
.
tabs
;
back
(
tabs
.
length
);
}
else
{
NativeToast
.
showNativeToast
(
event
.
message
);
stateLive
.
notifyView
(
FAIL
);
}
})
.
addToDispose
(
rxDispose
)
.
onError
((
error
)
{
PrintUtil
.
printBug
(
error
);
stateLive
.
notifyView
(
FAIL
);
});
}
}
}
lib/ClueModel/page/top/TopPage.dart
View file @
26f0dd26
...
@@ -2,15 +2,20 @@
...
@@ -2,15 +2,20 @@
* @author lsy
* @author lsy
* @date 2020/7/2
* @date 2020/7/2
**/
**/
import
'dart:ui'
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoPage.dart'
;
import
'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoPage.dart'
;
import
'package:gm_flutter/ClueModel/page/top/TopModel.dart'
;
import
'package:gm_flutter/ClueModel/page/top/TopModel.dart'
;
import
'package:gm_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gm_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gm_flutter/commonModel/base/BaseState.dart'
;
import
'package:gm_flutter/commonModel/base/BaseState.dart'
;
import
'package:gm_flutter/commonModel/
view/baseTabIndicator
.dart'
;
import
'package:gm_flutter/commonModel/
util/DartUtil
.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'TopList.dart'
;
class
TopPage
extends
StatefulWidget
{
class
TopPage
extends
StatefulWidget
{
@override
@override
State
<
StatefulWidget
>
createState
()
=>
TopPageState
();
State
<
StatefulWidget
>
createState
()
=>
TopPageState
();
...
@@ -23,12 +28,20 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
...
@@ -23,12 +28,20 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
@override
@override
void
initState
()
{
void
initState
()
{
tabController
=
TabController
(
length:
4
,
vsync:
this
);
init
(
);
super
.
initState
();
super
.
initState
();
}
}
void
init
()
{
_model
.
init
((
i
)
{
tabController
=
TabController
(
length:
i
,
vsync:
this
);
setState
(()
{});
});
}
@override
@override
void
dispose
()
{
void
dispose
()
{
_model
.
dispose
();
refreshController
.
dispose
();
refreshController
.
dispose
();
super
.
dispose
();
super
.
dispose
();
}
}
...
@@ -36,63 +49,73 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
...
@@ -36,63 +49,73 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
@override
@override
Widget
buildItem
(
BuildContext
context
)
{
Widget
buildItem
(
BuildContext
context
)
{
return
Scaffold
(
return
Scaffold
(
body:
home
(),
body:
baseStateView
(
MediaQuery
.
of
(
context
).
size
.
width
,
MediaQuery
.
of
(
context
).
size
.
height
,
_model
.
stateLive
,
Stack
(
children:
<
Widget
>[
Container
(
width:
MediaQuery
.
of
(
context
).
size
.
width
,
height:
MediaQuery
.
of
(
context
).
size
.
height
,
child:
NotificationListener
(
onNotification:
(
scrollNotification
)
{
if
(
scrollNotification
is
ScrollUpdateNotification
&&
scrollNotification
.
metrics
.
axisDirection
.
index
==
2
)
{
print
(
"
${scrollNotification}
"
);
}
return
false
;
},
child:
home
(),
),
),
baseSliverBack
(()
{
Navigator
.
of
(
context
).
pop
();
}),
baseSliverTitle
(
"title"
,
MediaQuery
.
of
(
context
).
size
.
width
),
],
),
()
{
init
();
}),
);
);
}
}
Widget
home
()
{
Widget
home
()
{
return
baseRefreshView
(
refreshController
,
()
{},
null
,
null
,
List
<
Widget
>
list
=
[];
customScrollView:
CustomScrollView
(
slivers:
<
Widget
>[
var
d
=
MediaQueryData
.
fromWindow
(
window
).
padding
.
top
;
SliverAppBar
(
for
(
int
i
=
0
;
i
<
_model
.
tabs
.
length
;
i
++)
{
pinned:
true
,
list
.
add
(
TopList
(
_model
.
tabs
[
i
].
id
,
48
+
d
).
toActive
());
elevation:
0
,
}
expandedHeight:
0
,
return
DefaultTabController
(
flexibleSpace:
FlexibleSpaceBar
(
title:
Text
(
'二级方案'
)),
length:
_model
.
tabs
.
length
,
),
child:
NestedScrollView
(
SliverToBoxAdapter
(
headerSliverBuilder:
child:
Column
(
(
BuildContext
context
,
bool
innerBoxIsScrolled
)
{
crossAxisAlignment:
CrossAxisAlignment
.
start
,
return
<
Widget
>[
mainAxisSize:
MainAxisSize
.
max
,
SliverOverlapAbsorber
(
children:
<
Widget
>[
handle:
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
Container
(
context
),
height:
50
,
sliver:
baseSliverAppBar
(
_model
.
imageUrl
)),
color:
Colors
.
pink
,
SliverPersistentHeader
(
)
pinned:
true
,
],
delegate:
StickyTabBarDelegate
(
)),
child:
Container
(
SliverPersistentHeader
(
height:
40
,
pinned:
true
,
color:
Colors
.
white
,
delegate:
StickyTabBarDelegate
(
child:
baseTabBar
(
null
,
getTabs
(),
(
index
)
{
child:
Container
(
_model
.
selectTab
(
index
);
height:
40
,
}),
color:
Colors
.
white
,
)),
child:
baseTabBar
(
tabController
,
getTabs
(),
(
index
)
{
),
_model
.
selectTab
(
index
);
];
}),
},
)),
body:
TabBarView
(
children:
list
)));
),
SliverFillRemaining
(
child:
TabBarView
(
controller:
tabController
,
children:
<
Widget
>[
Container
(
color:
Colors
.
red
,
),
Container
(
color:
Colors
.
red
,
),
Container
(
color:
Colors
.
red
,
),
Container
(
color:
Colors
.
blue
,
)
]))
]));
}
}
List
<
Widget
>
getTabs
()
{
List
<
Widget
>
getTabs
()
{
List
<
Widget
>
list
=
[];
List
<
Widget
>
list
=
[];
for
(
int
i
=
0
;
i
<
_model
.
tabs
.
length
;
i
++)
{
for
(
int
i
=
0
;
i
<
_model
.
tabs
.
length
;
i
++)
{
list
.
add
(
baseTabBarItem
(
_model
.
tabs
[
i
],
list
.
add
(
baseTabBarItem
(
_model
.
tabs
[
i
]
.
name
,
leftPadding:
i
==
0
?
24
:
28
,
leftPadding:
i
==
0
?
24
:
28
,
rightPadding:
i
==
_model
.
tabs
.
length
-
1
?
24
:
28
));
rightPadding:
i
==
_model
.
tabs
.
length
-
1
?
24
:
28
));
}
}
...
...
lib/ClueModel/server/api/ClueApi.dart
View file @
26f0dd26
...
@@ -6,11 +6,13 @@ import 'package:flutter_common/Annotations/anno/Get.dart';
...
@@ -6,11 +6,13 @@ 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/PlanBarBean.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/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"
)
...
@@ -32,12 +34,15 @@ abstract class ClueApi {
...
@@ -32,12 +34,15 @@ abstract class ClueApi {
@Get
(
"api/janus/plans/feed"
)
@Get
(
"api/janus/plans/feed"
)
PlanFeedBean
getPlanFeed
(
PlanFeedBean
getPlanFeed
(
@Query
(
"tag_id"
)
String
tag_id
,
@Query
(
"tag_id"
)
String
tag_id
,
@Query
(
"order_by"
)
String
order_by
,
@Query
(
"order_by"
)
String
order_by
,
@Query
(
"current_city_id"
)
String
current_city_id
,
@Query
(
"current_city_id"
)
String
current_city_id
,
@Query
(
"min_price"
)
String
min_price
,
@Query
(
"min_price"
)
String
min_price
,
@Query
(
"max_price"
)
String
max_price
,
@Query
(
"max_price"
)
String
max_price
,
@Query
(
"rank_type"
)
String
rank_type
,
@Query
(
"rank_type"
)
String
rank_type
,
@Query
(
"page"
)
int
page
,
@Query
(
"page"
)
int
page
,
);
);
@Get
(
"api/janus/plans/rank"
)
PlanBarBean
getPlanBar
(
@Query
(
"rank_type"
)
String
rank_type
);
}
}
lib/ClueModel/server/api/ClueApi.serv.dart
View file @
26f0dd26
...
@@ -20,6 +20,7 @@ import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
...
@@ -20,6 +20,7 @@ import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import
'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanCompareDetail.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanBean.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanBean.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/PlanBarBean.dart'
;
const
bool
inProduction
=
const
bool
.
fromEnvironment
(
"dart.vm.product"
);
const
bool
inProduction
=
const
bool
.
fromEnvironment
(
"dart.vm.product"
);
...
@@ -139,6 +140,19 @@ class ClueApiImpl {
...
@@ -139,6 +140,19 @@ class ClueApiImpl {
});
});
}
}
Stream
<
PlanBarBean
>
getPlanBar
(
Dio
_dio
,
String
rank_type
)
{
return
Stream
.
fromFuture
(
get
(
_dio
,
'api/janus/plans/rank'
,
data:
{
'rank_type'
:
rank_type
,
})).
flatMap
((
value
)
{
if
(
value
!=
null
&&
(
value
.
statusCode
>=
200
&&
value
.
statusCode
<
300
))
{
return
Stream
.
fromFuture
(
compute
(
parsePlanBarBean
,
value
.
toString
()));
}
else
{
throw
Exception
(
"--未知网络错误--"
);
}
});
}
///==================base method==================
///==================base method==================
Future
<
Response
>
get
(
Dio
_dio
,
url
,
{
data
,
options
,
cancelToken
})
async
{
Future
<
Response
>
get
(
Dio
_dio
,
url
,
{
data
,
options
,
cancelToken
})
async
{
...
@@ -299,3 +313,7 @@ PlanBean parsePlanBean(String value) {
...
@@ -299,3 +313,7 @@ PlanBean parsePlanBean(String value) {
PlanFeedBean
parsePlanFeedBean
(
String
value
)
{
PlanFeedBean
parsePlanFeedBean
(
String
value
)
{
return
PlanFeedBean
.
fromJson
(
json
.
decode
(
value
));
return
PlanFeedBean
.
fromJson
(
json
.
decode
(
value
));
}
}
PlanBarBean
parsePlanBarBean
(
String
value
)
{
return
PlanBarBean
.
fromJson
(
json
.
decode
(
value
));
}
lib/ClueModel/server/entity/PlanBarBean.dart
0 → 100644
View file @
26f0dd26
/*
* @author lsy
* @date 2020/7/3
**/
class
PlanBarBean
{
int
error
;
String
message
;
Null
extra
;
Null
errorExtra
;
UserType
userType
;
Data
data
;
PlanBarBean
({
this
.
error
,
this
.
message
,
this
.
extra
,
this
.
errorExtra
,
this
.
userType
,
this
.
data
});
PlanBarBean
.
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
{
String
bannerImage
;
List
<
Tabs
>
tabs
;
Data
({
this
.
bannerImage
,
this
.
tabs
});
Data
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
bannerImage
=
json
[
'banner_image'
];
if
(
json
[
'tabs'
]
!=
null
)
{
tabs
=
new
List
<
Tabs
>();
json
[
'tabs'
].
forEach
((
v
)
{
tabs
.
add
(
new
Tabs
.
fromJson
(
v
));
});
}
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'banner_image'
]
=
this
.
bannerImage
;
if
(
this
.
tabs
!=
null
)
{
data
[
'tabs'
]
=
this
.
tabs
.
map
((
v
)
=>
v
.
toJson
()).
toList
();
}
return
data
;
}
}
class
Tabs
{
bool
selected
;
int
id
;
String
name
;
Tabs
({
this
.
selected
,
this
.
id
,
this
.
name
});
Tabs
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
selected
=
json
[
'selected'
];
id
=
json
[
'id'
];
name
=
json
[
'name'
];
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'selected'
]
=
this
.
selected
;
data
[
'id'
]
=
this
.
id
;
data
[
'name'
]
=
this
.
name
;
return
data
;
}
}
lib/commonModel/base/BaseComponent.dart
View file @
26f0dd26
...
@@ -8,9 +8,11 @@ import 'package:flutter/gestures.dart';
...
@@ -8,9 +8,11 @@ import 'package:flutter/gestures.dart';
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/rendering.dart'
;
import
'package:flutter/rendering.dart'
;
import
'package:flutter_common/commonModel/eventbus/GlobalEventBus.dart'
;
import
'package:flutter_common/commonModel/eventbus/GlobalEventBus.dart'
;
import
'package:flutter_common/commonModel/live/LiveData.dart'
;
import
'package:flutter_common/commonModel/view/iOSLoading.dart'
;
import
'package:flutter_common/commonModel/view/iOSLoading.dart'
;
import
'package:flutter_svg/svg.dart'
;
import
'package:flutter_svg/svg.dart'
;
import
'package:gm_flutter/commonModel/GMBase.dart'
;
import
'package:gm_flutter/commonModel/GMBase.dart'
;
import
'package:gm_flutter/commonModel/bean/Pair.dart'
;
import
'package:gm_flutter/commonModel/util/DartUtil.dart'
;
import
'package:gm_flutter/commonModel/util/DartUtil.dart'
;
import
'package:gm_flutter/commonModel/view/ImagesAnimation.dart'
;
import
'package:gm_flutter/commonModel/view/ImagesAnimation.dart'
;
import
'package:gm_flutter/commonModel/view/baseTabIndicator.dart'
;
import
'package:gm_flutter/commonModel/view/baseTabIndicator.dart'
;
...
@@ -289,7 +291,7 @@ Widget baseRefreshView(RefreshController refreshController,
...
@@ -289,7 +291,7 @@ Widget baseRefreshView(RefreshController refreshController,
bool
pullDown
=
true
,
bool
pullDown
=
true
,
VoidCallback
onLoading
,
VoidCallback
onLoading
,
ScrollController
scrollController
,
ScrollController
scrollController
,
CustomScrollView
customScrollView
})
{
Widget
customScrollView
})
{
return
SmartRefresher
(
return
SmartRefresher
(
enablePullDown:
pullDown
,
enablePullDown:
pullDown
,
enablePullUp:
pullUp
,
enablePullUp:
pullUp
,
...
@@ -307,9 +309,10 @@ Widget baseRefreshView(RefreshController refreshController,
...
@@ -307,9 +309,10 @@ Widget baseRefreshView(RefreshController refreshController,
// body = baseText("加载中", 12, Color(0xff545454));
// body = baseText("加载中", 12, Color(0xff545454));
// } else if (mode == LoadStatus.failed) {
// } else if (mode == LoadStatus.failed) {
// body = baseText("加载失败", 12, Color(0xff545454));
// body = baseText("加载失败", 12, Color(0xff545454));
// } else if (mode == LoadStatus.noMore) {
// } else
// body = baseText("没有更多数据了", 12, Color(0xff545454));
if
(
mode
==
LoadStatus
.
noMore
)
{
// }
body
=
baseText
(
"没有更多数据了"
,
12
,
Color
(
0xff545454
));
}
// else {
// else {
// body = Container();
// body = Container();
// }
// }
...
@@ -422,7 +425,7 @@ Widget baseTabBarItem(String text,
...
@@ -422,7 +425,7 @@ Widget baseTabBarItem(String text,
rightPadding
=
rightPadding
??
28.0
;
rightPadding
=
rightPadding
??
28.0
;
double
width
=
leftPadding
+
text
.
length
*
16.0
+
rightPadding
;
double
width
=
leftPadding
+
text
.
length
*
16.0
+
rightPadding
;
return
Container
(
return
Container
(
height:
40
,
height:
40
.0
,
width:
wantWidth
??
width
,
width:
wantWidth
??
width
,
alignment:
Alignment
.
center
,
alignment:
Alignment
.
center
,
child:
Tab
(
child:
Tab
(
...
@@ -430,3 +433,68 @@ Widget baseTabBarItem(String text,
...
@@ -430,3 +433,68 @@ Widget baseTabBarItem(String text,
),
),
);
);
}
}
Widget
baseSliverAppBar
(
String
url
,
{
double
height
,
double
elevation
})
{
return
SliverAppBar
(
pinned:
true
,
centerTitle:
true
,
elevation:
elevation
??
0
,
expandedHeight:
height
??
200
,
automaticallyImplyLeading:
false
,
flexibleSpace:
FlexibleSpaceBar
(
background:
Image
.
network
(
url
??
''
,
fit:
BoxFit
.
cover
,
),
),
);
}
Widget
baseSliverBack
(
VoidCallback
tap
)
{
return
Positioned
(
top:
49
,
left:
15
,
child:
GestureDetector
(
behavior:
HitTestBehavior
.
opaque
,
onTap:
tap
,
child:
Container
(
width:
30
,
height:
30
,
decoration:
BoxDecoration
(
color:
Color
(
0x99FFFFFF
),
shape:
BoxShape
.
circle
),
alignment:
Alignment
.
center
,
child:
Container
(
child:
Image
.
asset
(
"assets/left_arrow.png"
),
),
)),
);
}
Widget
baseSliverTitle
(
String
text
,
double
width
)
{
return
Positioned
(
top:
57
,
child:
Container
(
alignment:
Alignment
.
center
,
width:
width
,
child:
baseText
(
text
,
18
,
Color
(
0xff333333
)),
),
);
}
Widget
baseStateView
(
double
width
,
double
height
,
LiveData
<
int
>
stateLive
,
Widget
home
,
VoidCallback
retry
)
{
return
StreamBuilder
(
stream:
stateLive
.
stream
,
initialData:
stateLive
.
data
??
LOADING
,
builder:
(
c
,
data
)
{
if
(
data
.
data
==
LOADING
)
{
return
loadingItem
();
}
else
if
(
data
.
data
==
FAIL
)
{
return
errorItem
(
width
,
height
,
retry
);
}
else
if
(
data
.
data
==
EMPTY
)
{
return
emptyItem
(
width
,
height
);
}
return
home
;
},
);
}
lib/commonModel/bean/Pair.dart
View file @
26f0dd26
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
const
LOADING
=
0
;
const
LOADING
=
0
;
const
ENDLOADING
=
1
;
const
ENDLOADING
=
1
;
const
FAIL
=
2
;
const
FAIL
=
2
;
const
EMPTY
=
3
;
class
Pair
<
T
,
S
>
{
class
Pair
<
T
,
S
>
{
dynamic
first
;
dynamic
first
;
...
...
pubspec.lock
View file @
26f0dd26
...
@@ -211,6 +211,13 @@ packages:
...
@@ -211,6 +211,13 @@ packages:
url: "https://pub.flutter-io.cn"
url: "https://pub.flutter-io.cn"
source: hosted
source: hosted
version: "1.1.1"
version: "1.1.1"
extended_nested_scroll_view:
dependency: "direct main"
description:
name: extended_nested_scroll_view
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
file:
file:
dependency: transitive
dependency: transitive
description:
description:
...
@@ -783,4 +790,4 @@ packages:
...
@@ -783,4 +790,4 @@ packages:
version: "2.2.1"
version: "2.2.1"
sdks:
sdks:
dart: ">=2.8.0 <3.0.0"
dart: ">=2.8.0 <3.0.0"
flutter: ">=1.1
2.13+hotfix.5
<2.0.0"
flutter: ">=1.1
7.0
<2.0.0"
pubspec.yaml
View file @
26f0dd26
...
@@ -33,6 +33,7 @@ dependencies:
...
@@ -33,6 +33,7 @@ dependencies:
shared_preferences
:
^0.5.7+1
shared_preferences
:
^0.5.7+1
lottie
:
^0.4.0+1
lottie
:
^0.4.0+1
app_settings
:
^4.0.1+1
app_settings
:
^4.0.1+1
extended_nested_scroll_view
:
^1.0.0
dev_dependencies
:
dev_dependencies
:
...
...
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