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
5fdd70c6
Commit
5fdd70c6
authored
Jul 06, 2020
by
林生雨
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
commit
parent
ec0284ff
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
370 additions
and
230 deletions
+370
-230
LevelOneItem.dart
lib/ClueModel/page/levelOne/LevelOneItem.dart
+0
-0
LevelOneList.dart
lib/ClueModel/page/levelOne/LevelOneList.dart
+35
-10
LevelOneModel.dart
lib/ClueModel/page/levelOne/LevelOneModel.dart
+2
-20
LevelOnePage.dart
lib/ClueModel/page/levelOne/LevelOnePage.dart
+73
-100
TopList.dart
lib/ClueModel/page/top/TopList.dart
+25
-6
TopModel.dart
lib/ClueModel/page/top/TopModel.dart
+4
-2
TopPage.dart
lib/ClueModel/page/top/TopPage.dart
+109
-70
MainManager.dart
lib/MainRouter/manager/MainManager.dart
+4
-2
BaseComponent.dart
lib/commonModel/base/BaseComponent.dart
+2
-1
BaseUtil.dart
lib/commonModel/base/BaseUtil.dart
+2
-1
SimpleEventBus.dart
lib/commonModel/eventbus/SimpleEventBus.dart
+43
-0
baseRefreshIndicator.dart
lib/commonModel/view/baseRefreshIndicator.dart
+4
-4
main.dart
lib/main.dart
+36
-14
pubspec.lock
pubspec.lock
+7
-0
pubspec.yaml
pubspec.yaml
+2
-0
updateAar.sh
updateAar.sh
+22
-0
No files found.
lib/ClueModel/page/levelOne/LevelOneItem.dart
View file @
5fdd70c6
This diff is collapsed.
Click to expand it.
lib/ClueModel/page/levelOne/LevelOneList.dart
View file @
5fdd70c6
...
...
@@ -7,6 +7,8 @@ import 'package:flutter/material.dart';
import
'package:gm_flutter/ClueModel/page/levelOne/LevelOneListModel.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'
;
import
'package:gm_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gm_flutter/commonModel/bean/Pair.dart'
;
import
'package:gm_flutter/commonModel/eventbus/SimpleEventBus.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'LevelOneItem.dart'
;
...
...
@@ -16,37 +18,47 @@ class LevelOneList extends StatefulWidget {
int
planId
;
String
tabName
;
LevelOneList
(
this
.
planId
,
this
.
tabName
,
this
.
topHeight
);
LevelOneList
(
this
.
planId
,
this
.
tabName
,
this
.
topHeight
);
@override
State
<
StatefulWidget
>
createState
()
=>
LevelOneListState
();
}
class
LevelOneListState
extends
State
<
LevelOneList
>
{
class
LevelOneListState
extends
State
<
LevelOneList
>
with
AutomaticKeepAliveClientMixin
{
LevelOneListModel
_model
=
LevelOneListModel
();
RefreshController
refreshController
=
RefreshController
();
Function
(
String
str
)
refresh
;
@override
void
initState
()
{
super
.
initState
();
_model
.
plan_id
=
widget
.
planId
;
_model
.
tab_type
=
widget
.
tabName
;
_model
.
plan_id
=
widget
.
planId
;
_model
.
tab_type
=
widget
.
tabName
;
_model
.
refreshView
(
true
);
refresh
=
(
str
)
{
_model
.
stateLive
.
notifyView
(
LOADING
);
_model
.
refreshView
(
true
);
};
SimpleEventBus
.
instance
().
resignEvent
(
"LevelOneList"
,
refresh
);
}
@override
void
dispose
()
{
refreshController
.
dispose
();
_model
.
dispose
();
SimpleEventBus
.
instance
().
unResignEvent
(
"LevelOneList"
,
refresh
);
super
.
dispose
();
}
@override
Widget
build
(
BuildContext
context
)
{
super
.
build
(
context
);
return
baseStateView
(
MediaQuery
.
of
(
context
).
size
.
width
,
MediaQuery
.
of
(
context
).
size
.
height
,
_model
.
stateLive
,
pages
(),
()
{
_model
.
refreshView
(
true
);
},
paddingTop:
widget
.
topHeight
);
},
paddingTop:
widget
.
topHeight
);
}
Widget
pages
()
{
...
...
@@ -56,9 +68,9 @@ class LevelOneListState extends State<LevelOneList> {
physics:
ClampingScrollPhysics
(),
// shrinkWrap: true,
slivers:
<
Widget
>[
SliverOverlapInjector
(
handle:
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
),
//
SliverOverlapInjector(
//
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
//
),
StreamBuilder
<
List
<
Cards
>>(
stream:
_model
.
cardsLive
.
stream
,
initialData:
_model
.
cardsLive
.
data
??
[],
...
...
@@ -71,9 +83,15 @@ class LevelOneListState extends State<LevelOneList> {
return
SliverList
(
delegate:
SliverChildBuilderDelegate
(
(
BuildContext
context
,
int
index
)
{
if
(
index
==
_model
.
data
.
length
){
return
Container
(
height:
40
,
color:
Color
(
0xffF7F6FA
),
);
}
return
LevelOneItem
(
_model
.
data
[
index
]);
},
childCount:
_model
.
data
.
length
,
childCount:
_model
.
data
.
length
+
1
,
),
);
},
...
...
@@ -82,10 +100,14 @@ class LevelOneListState extends State<LevelOneList> {
stream:
_model
.
cardsLive
.
stream
,
initialData:
_model
.
data
??
[],
builder:
(
c
,
data
)
{
double
totalHeight
=
0
;
_model
.
data
.
forEach
((
element
)
{
totalHeight
+=
LevelOneItem
.
getCardTypeHeight
(
element
);
});
double
height
=
MediaQuery
.
of
(
context
).
size
.
height
-
40
-
widget
.
topHeight
-
100
*
_model
.
data
.
length
;
totalHeight
;
return
SliverToBoxAdapter
(
child:
Container
(
height:
height
<
0
?
0
:
height
,
...
...
@@ -98,4 +120,7 @@ class LevelOneListState extends State<LevelOneList> {
_model
.
loadMore
();
},
pullDown:
false
,
pullUp:
true
);
}
@override
bool
get
wantKeepAlive
=>
true
;
}
lib/ClueModel/page/levelOne/LevelOneModel.dart
View file @
5fdd70c6
...
...
@@ -16,21 +16,12 @@ import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
class
LevelOneModel
extends
BaseModel
{
LiveData
<
double
>
appBarLive
=
LiveData
();
LiveData
<
bool
>
showTab
=
LiveData
();
LiveData
<
int
>
topIndexLive
=
new
LiveData
();
LiveData
<
double
>
topScrollLive
=
new
LiveData
();
LiveData
<
int
>
stateLive
=
LiveData
();
LiveData
<
double
>
textLive
=
LiveData
();
RxDispose
rxDispose
=
RxDispose
();
LiveData
<
Pair
<
int
,
List
<
Cards
>>>
cardsLive
=
LiveData
();
Map
<
int
,
List
<
Cards
>>
data
=
new
Map
();
List
list
=
[
"plan"
,
"hospital"
,
"doctor"
,
"diary"
];
List
<
Tabs
>
tabsList
=
[];
List
pageList
=
[
1
,
1
,
1
,
1
];
List
pageHeightList
=
[
118
,
149
,
118
,
118
];
int
plan_id
=
0
;
PlanOverData
planoverItem
;
...
...
@@ -39,7 +30,7 @@ class LevelOneModel extends BaseModel {
.
getPlanOverView
(
DioUtil
.
getInstance
().
getDio
(),
plan_id
)
.
listen
((
event
)
{
if
(
event
.
error
==
0
)
{
planoverItem
=
event
.
data
;
planoverItem
=
event
.
data
;
tabsList
=
event
.
data
.
tabs
;
stateLive
.
notifyView
(
ENDLOADING
);
callback
();
...
...
@@ -55,22 +46,13 @@ class LevelOneModel extends BaseModel {
});
}
int
currentIndex
=
0
;
@override
void
dispose
()
{
showTab
.
dispost
();
cardsLive
.
dispost
();
appBarLive
.
dispost
();
topIndexLive
.
dispost
();
topScrollLive
.
dispost
();
stateLive
.
dispost
();
textLive
.
dispost
();
}
void
selectTab
(
int
index
)
{
}
void
selectTab
(
int
index
)
{}
}
lib/ClueModel/page/levelOne/LevelOnePage.dart
View file @
5fdd70c6
...
...
@@ -6,97 +6,78 @@ import 'dart:async';
import
'dart:math'
;
import
'dart:ui'
;
import
'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
as
extend
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/gestures.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_boost/flutter_boost.dart'
;
import
'package:flutter_common/commonModel/live/LiveData.dart'
;
import
'package:gm_flutter/ClueModel/page/levelOne/LevelOneItem.dart'
;
import
'package:flutter/services.dart'
;
import
'package:gm_flutter/ClueModel/page/levelOne/LevelOneList.dart'
;
import
'package:gm_flutter/ClueModel/page/levelOne/LevelOneModel.dart'
;
import
'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoPage.dart'
;
import
'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'
;
import
'package:gm_flutter/ClueModel/util/PosUtil.dart'
;
import
'package:gm_flutter/ClueModel/view/FiveStarView.dart'
;
import
'package:gm_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gm_flutter/commonModel/base/BaseState.dart'
;
import
'package:gm_flutter/commonModel/bean/Pair.dart'
;
import
'package:gm_flutter/commonModel/base/BaseUtil.dart'
;
import
'package:gm_flutter/commonModel/eventbus/SimpleEventBus.dart'
;
import
'package:gm_flutter/commonModel/util/DartUtil.dart'
;
import
'package:gm_flutter/commonModel/view/baseRefreshIndicator.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'LevelOneBar.dart'
;
class
LevelOnePage
extends
StatefulWidget
{
@override
State
<
StatefulWidget
>
createState
()
=>
LevelOneState
();
}
class
LevelOneState
extends
BaseState
<
LevelOnePage
>
{
class
LevelOneState
extends
BaseState
<
LevelOnePage
>
with
TickerProviderStateMixin
{
int
planId
=
10
;
LevelOneModel
_model
=
new
LevelOneModel
();
RefreshController
_refreshController
=
RefreshController
();
PageController
pageController
=
new
PageController
();
GlobalKey
keyTop
=
new
GlobalKey
();
GlobalKey
key1
=
new
GlobalKey
();
double
screenWidth
;
List
<
Widget
>
oneList
=
new
List
();
int
lastPageIndex
=
0
;
TabController
tabController
;
int
index
=
0
;
static
const
MethodChannel
_methodChannel
=
MethodChannel
(
'gm_method_channel'
);
@override
void
initState
()
{
super
.
initState
();
_methodChannel
.
invokeMethod
(
"WHAT "
,
"www"
);
_model
.
init
(()
{
setState
(()
{}
);
_initTabBar
(
);
});
// pageController.addListener(() {
// if (screenWidth != null) {
// _model.topScrollLive.notifyView(
// pageController.offset / screenWidth * (screenWidth / 4));
// }
// });
}
void
_onScroll
(
double
offset
)
{
if
(
offset
<
10
)
{
_model
.
appBarLive
.
notifyView
(
0.0
);
}
else
if
(
offset
<
500
)
{
var
topPos
=
PosUtil
.
findPos
(
keyTop
);
if
(
topPos
!=
null
&&
topPos
.
dy
<
0
)
{
double
dy
=
-
topPos
.
dy
;
if
(
dy
<
20
)
{
dy
=
0
;
}
double
alpha
=
dy
/
112
;
if
(
alpha
<
0
)
{
alpha
=
0
;
}
else
if
(
alpha
>
1
)
{
alpha
=
1
;
}
_model
.
appBarLive
.
notifyView
(
alpha
);
}
}
if
(
offset
>
100
)
{
var
key1Pos
=
PosUtil
.
findPos
(
key1
);
if
(
key1Pos
!=
null
)
{
if
(
key1Pos
.
dy
<
86
)
{
_model
.
showTab
.
notifyView
(
true
);
}
else
{
_model
.
showTab
.
notifyView
(
false
);
}
}
void
_initTabBar
()
{
if
(
tabController
!=
null
)
{
tabController
.
removeListener
(
tabControlerListener
);
}
tabController
=
TabController
(
initialIndex:
index
,
length:
_model
.
tabsList
.
length
,
vsync:
this
);
tabController
.
addListener
(
tabControlerListener
);
setState
(()
{});
}
@override
void
dispose
()
{
tabController
?.
removeListener
(
tabControlerListener
);
tabController
?.
dispose
();
_model
.
dispose
();
pageController
.
dispose
();
_refreshController
.
dispose
();
super
.
dispose
();
}
void
tabControlerListener
()
{
if
(
index
!=
tabController
.
index
)
{
index
=
tabController
.
index
;
}
}
@override
Widget
buildItem
(
BuildContext
context
)
{
oneList
.
clear
();
...
...
@@ -117,11 +98,13 @@ class LevelOneState extends BaseState<LevelOnePage> {
MediaQuery
.
of
(
context
).
size
.
height
,
_model
.
stateLive
,
Container
(
child:
NestedScrollViewRefreshIndicator
(
child:
Base
NestedScrollViewRefreshIndicator
(
onRefresh:
()
async
{
Completer
completer
=
new
Completer
();
_model
.
init
(()
{
setState
(()
{});
_initTabBar
();
SimpleEventBus
.
instance
()
.
notifyListener
(
"LevelOneList"
,
""
);
completer
.
complete
();
});
return
completer
.
future
;
...
...
@@ -129,7 +112,7 @@ class LevelOneState extends BaseState<LevelOnePage> {
child:
newHomeWarp
()),
),
()
{
_model
.
init
(()
{
setState
(()
{}
);
_initTabBar
(
);
});
})));
}
...
...
@@ -180,48 +163,48 @@ class LevelOneState extends BaseState<LevelOnePage> {
List
<
Widget
>
list
=
[];
var
d
=
MediaQueryData
.
fromWindow
(
window
).
padding
.
top
;
for
(
int
i
=
0
;
i
<
_model
.
tabsList
.
length
;
i
++)
{
list
.
add
(
LevelOneList
(
planId
,
_model
.
tabsList
[
i
].
tabType
,
kToolbarHeight
+
d
)
.
toActive
()
);
list
.
add
(
extend
.
NestedScrollViewInnerScrollPositionKeyWidget
(
Key
(
"Tab
${i}
"
),
LevelOneList
(
planId
,
_model
.
tabsList
[
i
].
tabType
,
kToolbarHeight
+
d
)
)
);
}
final
double
statusBarHeight
=
MediaQuery
.
of
(
context
).
padding
.
top
;
final
double
pinnedHeaderHeight
=
statusBarHeight
+
kToolbarHeight
;
return
DefaultTabController
(
length:
_model
.
tabsList
.
length
,
child:
NestedScrollView
(
headerSliverBuilder:
(
BuildContext
context
,
bool
innerBoxIsScrolled
)
{
return
<
Widget
>[
SliverOverlapAbsorber
(
handle:
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
sliver:
baseSliverAppBar
(
return
extend
.
NestedScrollView
(
innerScrollPositionKeyBuilder:
()
{
String
index
=
'Tab
${tabController.index.toString()}
'
;
return
Key
(
index
);
},
headerSliverBuilder:
(
BuildContext
context
,
bool
innerBoxIsScrolled
)
{
return
<
Widget
>[
SliverOverlapAbsorber
(
handle:
extend
.
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
sliver:
baseSliverAppBar
(
// _model.imageUrl
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w"
)),
SliverList
(
delegate:
SliverChildBuilderDelegate
((
BuildContext
c
,
int
i
)
{
if
(
i
==
0
)
{
return
Container
(
height:
pinnedHeaderHeight
,
);
}
return
oneList
[
i
-
1
];
},
childCount:
oneList
.
length
+
1
)),
SliverPersistentHeader
(
pinned:
true
,
delegate:
StickyTabBarDelegate
(
child:
Container
(
height:
40
,
color:
Colors
.
white
,
child:
baseTabBar
(
null
,
getTabs
(),
(
index
)
{
_model
.
selectTab
(
index
);
},
scroll:
false
),
)),
),
];
},
body:
TabBarView
(
children:
list
)));
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w"
)),
SliverList
(
delegate:
SliverChildBuilderDelegate
((
BuildContext
c
,
int
i
)
{
if
(
i
==
0
)
{
return
Container
(
height:
pinnedHeaderHeight
,
);
}
return
oneList
[
i
-
1
];
},
childCount:
oneList
.
length
+
1
)),
SliverPersistentHeader
(
pinned:
true
,
delegate:
StickyTabBarDelegate
(
child:
Container
(
height:
40
,
color:
Colors
.
white
,
child:
baseTabBar
(
tabController
,
getTabs
(),
(
index
)
{
_model
.
selectTab
(
index
);
},
scroll:
false
),
)),
),
];
},
body:
TabBarView
(
controller:
tabController
,
children:
list
));
}
List
<
Widget
>
getTabs
()
{
...
...
@@ -405,16 +388,6 @@ class LevelOneState extends BaseState<LevelOnePage> {
);
}
Widget
feed
()
{
return
Container
(
key:
key1
,
child:
MessageBarView
(
topIndexLive:
_model
.
topIndexLive
,
topScrollLive:
_model
.
topScrollLive
,
pageController:
pageController
,
));
}
// Widget home() {
// return Column(
// children: <Widget>[
...
...
lib/ClueModel/page/top/TopList.dart
View file @
5fdd70c6
...
...
@@ -6,8 +6,11 @@ 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:gm_flutter/commonModel/bean/Pair.dart'
;
import
'package:gm_flutter/commonModel/eventbus/SimpleEventBus.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'TopListModel.dart'
;
class
TopList
extends
StatefulWidget
{
...
...
@@ -20,14 +23,21 @@ class TopList extends StatefulWidget {
State
<
StatefulWidget
>
createState
()
=>
TopListState
();
}
class
TopListState
extends
State
<
TopList
>
{
class
TopListState
extends
State
<
TopList
>
with
AutomaticKeepAliveClientMixin
{
RefreshController
refreshController
=
RefreshController
();
TopListModel
_model
=
TopListModel
();
Function
(
String
str
)
refresh
;
@override
void
initState
()
{
super
.
initState
();
_model
.
getData
(
true
);
refresh
=
(
str
)
{
_model
.
stateLive
.
notifyView
(
LOADING
);
_model
.
getData
(
true
);
};
SimpleEventBus
.
instance
().
resignEvent
(
"TopList"
,
refresh
);
print
(
"
${this}
INIT"
);
}
...
...
@@ -35,12 +45,14 @@ class TopListState extends State<TopList> {
void
dispose
()
{
refreshController
.
dispose
();
_model
.
dispose
();
SimpleEventBus
.
instance
().
unResignEvent
(
"TopList"
,
refresh
);
print
(
"
${this}
QUIT"
);
super
.
dispose
();
}
@override
Widget
build
(
BuildContext
context
)
{
super
.
build
(
context
);
return
baseStateView
(
MediaQuery
.
of
(
context
).
size
.
width
,
MediaQuery
.
of
(
context
).
size
.
height
,
_model
.
stateLive
,
home
(),
()
{
_model
.
getData
(
true
);
...
...
@@ -54,14 +66,18 @@ class TopListState extends State<TopList> {
physics:
ClampingScrollPhysics
(),
// shrinkWrap: true,
slivers:
<
Widget
>[
SliverOverlapInjector
(
handle:
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
SliverToBoxAdapter
(
child:
Container
(
height:
widget
.
topHeight
,
),
),
// extend.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
{
...
...
@@ -84,8 +100,8 @@ class TopListState extends State<TopList> {
builder:
(
c
,
data
)
{
double
height
=
MediaQuery
.
of
(
context
).
size
.
height
-
40
-
widget
.
topHeight
-
100
*
_model
.
datas
.
length
;
100
*
_model
.
datas
.
length
;
return
SliverToBoxAdapter
(
child:
Container
(
height:
height
<
0
?
0
:
height
,
...
...
@@ -98,4 +114,7 @@ class TopListState extends State<TopList> {
_model
.
loadMore
();
},
pullDown:
false
,
pullUp:
true
);
}
@override
bool
get
wantKeepAlive
=>
true
;
}
lib/ClueModel/page/top/TopModel.dart
View file @
5fdd70c6
...
...
@@ -2,6 +2,8 @@
* @author lsy
* @date 2020/7/2
**/
import
'package:dio/dio.dart'
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter_common/commonModel/live/BaseModel.dart'
;
import
'package:flutter_common/commonModel/live/LiveData.dart'
;
import
'package:flutter_common/commonModel/toast/NativeToast.dart'
;
...
...
@@ -40,7 +42,7 @@ class TopModel extends BaseModel {
tabIndex
=
index
;
}
void
init
(
Function
(
int
size
)
back
)
{
void
init
(
VoidCallback
back
)
{
ClueApiImpl
.
getInstance
()
.
getPlanBar
(
DioUtil
.
getInstance
().
getDio
(),
rank_type
)
.
listen
((
event
)
{
...
...
@@ -48,7 +50,7 @@ class TopModel extends BaseModel {
stateLive
.
notifyView
(
ENDLOADING
);
imageUrl
=
event
.
data
.
bannerImage
;
tabs
=
event
.
data
.
tabs
;
back
(
tabs
.
length
);
back
();
}
else
{
NativeToast
.
showNativeToast
(
event
.
message
);
stateLive
.
notifyView
(
FAIL
);
...
...
lib/ClueModel/page/top/TopPage.dart
View file @
5fdd70c6
...
...
@@ -3,16 +3,21 @@
* @date 2020/7/2
**/
import
'dart:async'
;
import
'dart:ui'
;
import
'package:flutter/cupertino.dart'
;
import
'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
as
extend
;
import
'package:flutter/material.dart'
;
import
'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoPage.dart'
;
import
'package:gm_flutter/ClueModel/page/top/TopModel.dart'
;
import
'package:gm_flutter/ClueModel/util/PosUtil.dart'
;
import
'package:gm_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gm_flutter/commonModel/base/BaseState.dart'
;
import
'package:gm_flutter/commonModel/eventbus/SimpleEventBus.dart'
;
import
'package:gm_flutter/commonModel/util/DartUtil.dart'
;
import
'package:gm_flutter/commonModel/view/baseRefreshIndicator.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
import
'TopList.dart'
;
...
...
@@ -25,7 +30,8 @@ class TopPage extends StatefulWidget {
class
TopPageState
extends
BaseState
<
TopPage
>
with
TickerProviderStateMixin
{
RefreshController
refreshController
=
RefreshController
();
TopModel
_model
=
TopModel
();
GlobalKey
globalKey
=
GlobalKey
();
int
index
=
0
;
TabController
tabController
;
@override
void
initState
()
{
...
...
@@ -34,18 +40,30 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
}
void
init
()
{
_model
.
init
((
i
)
{
setState
(()
{}
);
_model
.
init
(()
{
_initTabBar
(
);
});
}
@override
void
dispose
()
{
_model
.
dispose
();
tabController
?.
removeListener
(
tabControlerListener
);
tabController
?.
dispose
();
refreshController
.
dispose
();
super
.
dispose
();
}
void
_initTabBar
()
{
if
(
tabController
!=
null
)
{
tabController
.
removeListener
(
tabControlerListener
);
}
tabController
=
TabController
(
initialIndex:
index
,
length:
_model
.
tabs
.
length
,
vsync:
this
);
tabController
.
addListener
(
tabControlerListener
);
setState
(()
{});
}
@override
Widget
buildItem
(
BuildContext
context
)
{
return
Scaffold
(
...
...
@@ -53,84 +71,99 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
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
KeepAliveNotification
||
scrollNotification
is
OverscrollIndicatorNotification
)
{
return
false
;
}
if
(
scrollNotification
is
ScrollUpdateNotification
&&
scrollNotification
.
metrics
.
axisDirection
.
index
==
2
)
{}
print
(
"NOT
${scrollNotification}
${scrollNotification is KeepAliveNotification}
"
);
if
(
scrollNotification
.
depth
==
0
)
{
if
(
scrollNotification
.
metrics
.
pixels
>
80
)
{
_model
.
textLive
.
notifyView
(
(
scrollNotification
.
metrics
.
pixels
-
80
)
/
40
>
1.0
?
1.0
:
(
scrollNotification
.
metrics
.
pixels
-
80
)
/
40
);
}
else
{
_model
.
textLive
.
notifyView
(
0.0
);
}
}
else
if
(
scrollNotification
.
depth
==
2
)
{
if
(
scrollNotification
.
metrics
.
pixels
<
50
&&
scrollNotification
.
metrics
.
pixels
>
0
)
{
_model
.
textLive
.
notifyView
(
1.0
);
}
}
return
false
;
},
child:
home
(),
),
),
baseSliverBack
(()
{
Navigator
.
of
(
context
).
pop
();
}),
baseSliverTitle
(
"title"
,
MediaQuery
.
of
(
context
).
size
.
width
,
_model
.
textLive
)
],
Container
(
child:
BaseNestedScrollViewRefreshIndicator
(
onRefresh:
()
async
{
Completer
completer
=
new
Completer
();
_model
.
init
(()
{
_initTabBar
();
SimpleEventBus
.
instance
().
notifyListener
(
"TopList"
,
""
);
completer
.
complete
();
});
return
completer
.
future
;
},
child:
homeWarp
()),
),
()
{
init
();
}),
);
}
Widget
homeWarp
()
{
return
Stack
(
children:
<
Widget
>[
Container
(
width:
MediaQuery
.
of
(
context
).
size
.
width
,
height:
MediaQuery
.
of
(
context
).
size
.
height
,
child:
NotificationListener
(
onNotification:
(
scrollNotification
)
{
if
(
scrollNotification
is
KeepAliveNotification
||
scrollNotification
is
OverscrollIndicatorNotification
)
{
return
false
;
}
if
(
scrollNotification
is
ScrollUpdateNotification
&&
scrollNotification
.
metrics
.
axisDirection
.
index
==
2
)
{}
if
(
scrollNotification
.
depth
==
0
)
{
if
(
scrollNotification
.
metrics
.
pixels
>
80
)
{
_model
.
textLive
.
notifyView
(
(
scrollNotification
.
metrics
.
pixels
-
80
)
/
40
>
1.0
?
1.0
:
(
scrollNotification
.
metrics
.
pixels
-
80
)
/
40
);
}
else
{
_model
.
textLive
.
notifyView
(
0.0
);
}
}
else
if
(
scrollNotification
.
depth
==
2
)
{
if
(
scrollNotification
.
metrics
.
pixels
<
50
&&
scrollNotification
.
metrics
.
pixels
>
0
)
{
_model
.
textLive
.
notifyView
(
1.0
);
}
}
return
false
;
},
child:
home
(),
),
),
baseSliverBack
(()
{
Navigator
.
of
(
context
).
pop
();
}),
baseSliverTitle
(
"title"
,
MediaQuery
.
of
(
context
).
size
.
width
,
_model
.
textLive
)
],
);
}
Widget
home
()
{
List
<
Widget
>
list
=
[];
var
d
=
MediaQueryData
.
fromWindow
(
window
).
padding
.
top
;
for
(
int
i
=
0
;
i
<
_model
.
tabs
.
length
;
i
++)
{
list
.
add
(
TopList
(
_model
.
tabs
[
i
].
id
,
48
+
d
).
toActive
());
list
.
add
(
extend
.
NestedScrollViewInnerScrollPositionKeyWidget
(
Key
(
"Tab
${i}
"
),
TopList
(
_model
.
tabs
[
i
].
id
,
kToolbarHeight
+
d
)));
}
return
DefaultTabController
(
length:
_model
.
tabs
.
length
,
child:
NestedScrollView
(
headerSliverBuilder:
(
BuildContext
context
,
bool
innerBoxIsScrolled
)
{
return
<
Widget
>[
SliverOverlapAbsorber
(
handle:
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
sliver:
baseSliverAppBar
(
_model
.
imageUrl
)),
SliverPersistentHeader
(
pinned:
true
,
delegate:
StickyTabBarDelegate
(
child:
Container
(
height:
40
,
color:
Colors
.
white
,
child:
baseTabBar
(
null
,
getTabs
(),
(
index
)
{
_model
.
selectTab
(
index
);
}),
)),
),
];
},
body:
TabBarView
(
children:
list
)));
return
extend
.
NestedScrollView
(
innerScrollPositionKeyBuilder:
()
{
String
index
=
'Tab
${tabController.index.toString()}
'
;
return
Key
(
index
);
},
headerSliverBuilder:
(
BuildContext
context
,
bool
innerBoxIsScrolled
)
{
return
<
Widget
>[
SliverOverlapAbsorber
(
handle:
extend
.
NestedScrollView
.
sliverOverlapAbsorberHandleFor
(
context
),
sliver:
baseSliverAppBar
(
_model
.
imageUrl
)),
SliverPersistentHeader
(
pinned:
true
,
delegate:
StickyTabBarDelegate
(
child:
Container
(
height:
40
,
color:
Colors
.
white
,
child:
baseTabBar
(
tabController
,
getTabs
(),
(
index
)
{
_model
.
selectTab
(
index
);
}),
)),
),
];
},
body:
TabBarView
(
controller:
tabController
,
children:
list
));
}
List
<
Widget
>
getTabs
()
{
...
...
@@ -142,4 +175,10 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
}
return
list
;
}
void
tabControlerListener
()
{
if
(
index
!=
tabController
.
index
)
{
index
=
tabController
.
index
;
}
}
}
lib/MainRouter/manager/MainManager.dart
View file @
5fdd70c6
...
...
@@ -4,9 +4,10 @@
**/
import
'package:flutter/services.dart'
;
import
'package:flutter_boost/flutter_boost.dart'
;
import
'package:gm_flutter/commonModel/base/BaseUtil.dart'
;
class
MainManager
{
static
const
EventChannel
_channel
=
EventChannel
(
"flutter_plugin_event"
);
MainManager
.
_
()
{}
...
...
@@ -20,8 +21,9 @@ class MainManager {
}
startInit
()
{
_channel
.
receiveBroadcastStream
().
listen
((
data
)
{
flutterEvent
.
receiveBroadcastStream
().
listen
((
data
)
{
print
(
"LSY FLUTTER EVENT
${data}
"
);
});
flutterChannel
.
invokeMethod
(
"WHAT "
,
"www"
);
}
}
lib/commonModel/base/BaseComponent.dart
View file @
5fdd70c6
...
...
@@ -15,6 +15,7 @@ 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/view/ImagesAnimation.dart'
;
import
'package:gm_flutter/commonModel/view/baseRefreshIndicator.dart'
;
import
'package:gm_flutter/commonModel/view/baseTabIndicator.dart'
;
import
'package:lottie/lottie.dart'
;
import
'package:pull_to_refresh/pull_to_refresh.dart'
;
...
...
@@ -378,7 +379,7 @@ Widget normalRefreshHeader() {
Widget
emptyItem
(
double
width
,
double
height
,
{
String
detail
,
double
paddingTop
})
{
return
Container
(
padding:
EdgeInsets
.
only
(
top:
paddingTop
),
padding:
EdgeInsets
.
only
(
top:
paddingTop
??
0
),
width:
width
,
height:
height
,
color:
Colors
.
white
,
...
...
lib/commonModel/base/BaseUtil.dart
View file @
5fdd70c6
...
...
@@ -9,4 +9,5 @@ import 'package:flutter/material.dart';
import
'package:flutter/services.dart'
;
const
flutterChannel
=
const
MethodChannel
(
'gm_method_channel'
);
const
bool
isDebug
=
!
const
bool
.
fromEnvironment
(
"dart.vm.product"
);
const
flutterEvent
=
const
EventChannel
(
'flutter_plugin_event'
);
const
bool
isDebug
=
!
const
bool
.
fromEnvironment
(
"dart.vm.product"
);
lib/commonModel/eventbus/SimpleEventBus.dart
0 → 100644
View file @
5fdd70c6
/*
* @author lsy
* @date 2020/7/5
**/
import
'package:dio/dio.dart'
;
class
SimpleEventBus
{
static
SimpleEventBus
_eventBus
;
SimpleEventBus
.
_
();
static
SimpleEventBus
instance
(){
if
(
_eventBus
==
null
){
_eventBus
=
SimpleEventBus
.
_
();
}
return
_eventBus
;
}
Map
<
String
,
List
<
Function
(
String
str
)>>
map
=
Map
();
void
resignEvent
(
String
name
,
Function
(
String
str
)
func
){
if
(
map
[
name
]==
null
){
map
[
name
]=[];
}
map
[
name
].
add
(
func
);
}
void
unResignEvent
(
String
name
,
Function
(
String
str
)
func
){
if
(
map
[
name
]==
null
){
return
;
}
map
[
name
].
remove
(
func
);
}
void
notifyListener
(
String
name
,
String
str
){
if
(
map
[
name
]==
null
){
return
;
}
map
[
name
].
forEach
((
element
)
{
element
(
str
);
});
}
}
\ No newline at end of file
lib/commonModel/view/baseRefreshIndicator.dart
View file @
5fdd70c6
...
...
@@ -79,13 +79,13 @@ enum _RefreshIndicatorMode {
/// Must be used as a sliver inside a [CustomScrollView] instead of wrapping
/// around a [ScrollView] because it's a part of the scrollable instead of
/// being overlaid on top of it.
class
NestedScrollViewRefreshIndicator
extends
StatefulWidget
{
class
Base
NestedScrollViewRefreshIndicator
extends
StatefulWidget
{
/// Creates a refresh indicator.
///
/// The [onRefresh], [child], and [notificationPredicate] arguments must be
/// non-null. The default
/// [displacement] is 40.0 logical pixels.
const
NestedScrollViewRefreshIndicator
({
const
Base
NestedScrollViewRefreshIndicator
({
Key
key
,
@required
this
.
child
,
this
.
displacement
=
55.0
,
...
...
@@ -150,8 +150,8 @@ class NestedScrollViewRefreshIndicator extends StatefulWidget {
/// Contains the state for a [NestedScrollViewRefreshIndicator]. This class can be used to
/// programmatically show the refresh indicator, see the [show] method.
class
NestedScrollViewRefreshIndicatorState
extends
State
<
NestedScrollViewRefreshIndicator
>
with
TickerProviderStateMixin
<
NestedScrollViewRefreshIndicator
>
{
extends
State
<
Base
NestedScrollViewRefreshIndicator
>
with
TickerProviderStateMixin
<
Base
NestedScrollViewRefreshIndicator
>
{
AnimationController
_positionController
;
Animation
<
double
>
_positionFactor
;
Animation
<
double
>
_value
;
...
...
lib/main.dart
View file @
5fdd70c6
import
'dart:async'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/services.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:flutter_screenutil/screenutil.dart'
;
import
'package:gm_flutter/main.mark.dart'
;
import
'package:shared_preferences/shared_preferences.dart'
;
import
'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart'
;
...
...
@@ -37,7 +39,7 @@ void main() {
SharedPreferences
.
getInstance
().
then
((
value
)
{
sharedPreferences
=
value
;
});
RouterCenterImpl
().
findMainRouter
().
init
();
//
RouterCenterImpl().findMainRouter().init();
},
(
Object
error
,
StackTrace
stack
)
{
//TODO
print
(
"lsy EEEEEE
${error.toString()}
${stack.toString()}
"
);
...
...
@@ -58,7 +60,7 @@ class MyApp extends State<MyAppWidget> {
super
.
initState
();
FlutterBoost
.
singleton
.
registerPageBuilders
({
'demoPage'
:
(
pageName
,
params
,
_
)
{
return
Demo
Page
();
return
RouterCenterImpl
().
findClueRouter
().
getLevelOne
Page
();
},
'demoPage1'
:
(
pageName
,
params
,
_
)
{
return
DemoPage1
();
...
...
@@ -67,30 +69,30 @@ class MyApp extends State<MyAppWidget> {
FlutterBoost
.
singleton
.
addBoostContainerLifeCycleObserver
((
state
,
settings
)
{
print
(
"LSY
${state}
"
);
if
(
state
==
ContainerLifeCycle
.
Init
)
{
const
EventChannel
flutterEvent
=
const
EventChannel
(
'flutter_plugin_event'
);
flutterEvent
.
receiveBroadcastStream
().
listen
((
data
)
{
print
(
"LSY FLUTTER EVENT
${data}
"
);
});
MethodChannel
flutterChannel
=
const
MethodChannel
(
'gm_method_channel'
);
flutterChannel
.
invokeMethod
(
"FFINIT"
,
"Fff"
);
}
});
// FlutterBoost.singleton.addBoostNavigatorObserver(TestBoostNavigatorObserver());
}
@override
Widget
build
(
BuildContext
context
)
{
WindowUtil
.
setBarStatus
(
tru
e
);
WindowUtil
.
setBarStatus
(
fals
e
);
return
MaterialApp
(
theme:
ThemeData
(
primaryColor:
Colors
.
white
,
cursorColor:
Color
(
0xff20BDBB
),
highlightColor:
Colors
.
transparent
,
splashColor:
Colors
.
transparent
,
highlightColor:
Colors
.
transparent
,
splashColor:
Colors
.
transparent
,
canvasColor:
Colors
.
white
),
builder:
FlutterBoost
.
init
(
postPush:
_onRoutePushed
),
home:
isDebug
?
RouterCenterImpl
().
findMainRouter
().
getTestPage
()
:
Container
(
color:
Colors
.
white
,
child:
Center
(
child:
loadingItem
(),
),
));
home:
Home
());
}
void
_onRoutePushed
(
...
...
@@ -101,3 +103,23 @@ class MyApp extends State<MyAppWidget> {
Future
<
dynamic
>
_
,
)
{}
}
class
Home
extends
StatefulWidget
{
@override
State
<
StatefulWidget
>
createState
()
=>
HomeState
();
}
class
HomeState
extends
State
<
Home
>
{
@override
Widget
build
(
BuildContext
context
)
{
ScreenUtil
.
init
(
context
,
width:
375
,
height:
810
);
return
isDebug
?
RouterCenterImpl
().
findMainRouter
().
getTestPage
()
:
Container
(
color:
Colors
.
white
,
child:
Center
(
child:
loadingItem
(),
),
);
}
}
pubspec.lock
View file @
5fdd70c6
...
...
@@ -262,6 +262,13 @@ packages:
url: "https://github.com/asd451398533/flutter_common.git"
source: git
version: "0.0.1"
flutter_screenutil:
dependency: "direct main"
description:
name: flutter_screenutil
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
flutter_svg:
dependency: transitive
description:
...
...
pubspec.yaml
View file @
5fdd70c6
...
...
@@ -34,6 +34,8 @@ dependencies:
lottie
:
^0.4.0+1
app_settings
:
^4.0.1+1
extended_nested_scroll_view
:
^1.0.0
#适配库
flutter_screenutil
:
^1.1.0
dev_dependencies
:
...
...
updateAar.sh
0 → 100755
View file @
5fdd70c6
#!/usr/bin/env bash
echo
START
projectDir
=
`
pwd
`
rootFlutter
=
`
which flutter
`
rootDir
=
${
rootFlutter
%/*
}
#====clean
cd
${
projectDir
}
${
rootFlutter
}
clean
export
PUB_HOSTED_URL
=
https://pub.flutter-io.cn
export
FLUTTER_STORAGE_BASE_URL
=
https://storage.flutter-io.cn
${
rootFlutter
}
packages get
rm
-rf
${
projectDir
}
/build
flutter build aar
--release
--target-platform
android-arm
#rm -rf /Users/apple/lsy/gengmei_android/gm-flutter/libs/flutterApp.aar
cp
-r
${
projectDir
}
/build/host/outputs/repo/com/example/gm_flutter/flutter_release/1.0/flutter_release-1.0.aar /Users/apple/lsy/gengmei_android/gm-flutter/libs/flutterApp.aar
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