Commit 5fdd70c6 authored by 林生雨's avatar 林生雨

commit

parent ec0284ff
...@@ -7,6 +7,8 @@ import 'package:flutter/material.dart'; ...@@ -7,6 +7,8 @@ import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneListModel.dart'; import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneListModel.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.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 'package:pull_to_refresh/pull_to_refresh.dart';
import 'LevelOneItem.dart'; import 'LevelOneItem.dart';
...@@ -16,37 +18,47 @@ class LevelOneList extends StatefulWidget { ...@@ -16,37 +18,47 @@ class LevelOneList extends StatefulWidget {
int planId; int planId;
String tabName; String tabName;
LevelOneList(this.planId,this.tabName,this.topHeight); LevelOneList(this.planId, this.tabName, this.topHeight);
@override @override
State<StatefulWidget> createState() => LevelOneListState(); State<StatefulWidget> createState() => LevelOneListState();
} }
class LevelOneListState extends State<LevelOneList> { class LevelOneListState extends State<LevelOneList>
with AutomaticKeepAliveClientMixin{
LevelOneListModel _model = LevelOneListModel(); LevelOneListModel _model = LevelOneListModel();
RefreshController refreshController = RefreshController(); RefreshController refreshController = RefreshController();
Function(String str) refresh;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_model.plan_id=widget.planId; _model.plan_id = widget.planId;
_model.tab_type=widget.tabName; _model.tab_type = widget.tabName;
_model.refreshView(true); _model.refreshView(true);
refresh = (str) {
_model.stateLive.notifyView(LOADING);
_model.refreshView(true);
};
SimpleEventBus.instance().resignEvent("LevelOneList", refresh);
} }
@override @override
void dispose() { void dispose() {
refreshController.dispose(); refreshController.dispose();
_model.dispose(); _model.dispose();
SimpleEventBus.instance().unResignEvent("LevelOneList", refresh);
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context);
return baseStateView(MediaQuery.of(context).size.width, return baseStateView(MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height, _model.stateLive, pages(), () { MediaQuery.of(context).size.height, _model.stateLive, pages(), () {
_model.refreshView(true); _model.refreshView(true);
},paddingTop: widget.topHeight); }, paddingTop: widget.topHeight);
} }
Widget pages() { Widget pages() {
...@@ -56,9 +68,9 @@ class LevelOneListState extends State<LevelOneList> { ...@@ -56,9 +68,9 @@ class LevelOneListState extends State<LevelOneList> {
physics: ClampingScrollPhysics(), physics: ClampingScrollPhysics(),
// shrinkWrap: true, // shrinkWrap: true,
slivers: <Widget>[ slivers: <Widget>[
SliverOverlapInjector( // SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
), // ),
StreamBuilder<List<Cards>>( StreamBuilder<List<Cards>>(
stream: _model.cardsLive.stream, stream: _model.cardsLive.stream,
initialData: _model.cardsLive.data ?? [], initialData: _model.cardsLive.data ?? [],
...@@ -71,9 +83,15 @@ class LevelOneListState extends State<LevelOneList> { ...@@ -71,9 +83,15 @@ class LevelOneListState extends State<LevelOneList> {
return SliverList( return SliverList(
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) { (BuildContext context, int index) {
if(index==_model.data.length){
return Container(
height: 40,
color: Color(0xffF7F6FA),
);
}
return LevelOneItem(_model.data[index]); return LevelOneItem(_model.data[index]);
}, },
childCount: _model.data.length, childCount: _model.data.length+1,
), ),
); );
}, },
...@@ -82,10 +100,14 @@ class LevelOneListState extends State<LevelOneList> { ...@@ -82,10 +100,14 @@ class LevelOneListState extends State<LevelOneList> {
stream: _model.cardsLive.stream, stream: _model.cardsLive.stream,
initialData: _model.data ?? [], initialData: _model.data ?? [],
builder: (c, data) { builder: (c, data) {
double totalHeight = 0;
_model.data.forEach((element) {
totalHeight += LevelOneItem.getCardTypeHeight(element);
});
double height = MediaQuery.of(context).size.height - double height = MediaQuery.of(context).size.height -
40 - 40 -
widget.topHeight - widget.topHeight -
100 * _model.data.length; totalHeight;
return SliverToBoxAdapter( return SliverToBoxAdapter(
child: Container( child: Container(
height: height < 0 ? 0 : height, height: height < 0 ? 0 : height,
...@@ -98,4 +120,7 @@ class LevelOneListState extends State<LevelOneList> { ...@@ -98,4 +120,7 @@ class LevelOneListState extends State<LevelOneList> {
_model.loadMore(); _model.loadMore();
}, pullDown: false, pullUp: true); }, pullDown: false, pullUp: true);
} }
@override
bool get wantKeepAlive => true;
} }
...@@ -16,21 +16,12 @@ import 'package:gm_flutter/commonModel/util/PrintUtil.dart'; ...@@ -16,21 +16,12 @@ import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
class LevelOneModel extends BaseModel { 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<int> stateLive = LiveData();
LiveData<double> textLive = LiveData(); LiveData<double> textLive = LiveData();
RxDispose rxDispose = RxDispose(); 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<Tabs> tabsList = [];
List pageList = [1, 1, 1, 1];
List pageHeightList = [118, 149, 118, 118];
int plan_id = 0; int plan_id = 0;
PlanOverData planoverItem; PlanOverData planoverItem;
...@@ -39,7 +30,7 @@ class LevelOneModel extends BaseModel { ...@@ -39,7 +30,7 @@ class LevelOneModel extends BaseModel {
.getPlanOverView(DioUtil.getInstance().getDio(), plan_id) .getPlanOverView(DioUtil.getInstance().getDio(), plan_id)
.listen((event) { .listen((event) {
if (event.error == 0) { if (event.error == 0) {
planoverItem=event.data; planoverItem = event.data;
tabsList = event.data.tabs; tabsList = event.data.tabs;
stateLive.notifyView(ENDLOADING); stateLive.notifyView(ENDLOADING);
callback(); callback();
...@@ -55,22 +46,13 @@ class LevelOneModel extends BaseModel { ...@@ -55,22 +46,13 @@ class LevelOneModel extends BaseModel {
}); });
} }
int currentIndex = 0; int currentIndex = 0;
@override @override
void dispose() { void dispose() {
showTab.dispost();
cardsLive.dispost();
appBarLive.dispost();
topIndexLive.dispost();
topScrollLive.dispost();
stateLive.dispost(); stateLive.dispost();
textLive.dispost(); textLive.dispost();
} }
void selectTab(int index) { void selectTab(int index) {}
}
} }
...@@ -6,97 +6,78 @@ import 'dart:async'; ...@@ -6,97 +6,78 @@ import 'dart:async';
import 'dart:math'; import 'dart:math';
import 'dart:ui'; import 'dart:ui';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
as extend;
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_boost/flutter_boost.dart'; import 'package:flutter/services.dart';
import 'package:flutter_common/commonModel/live/LiveData.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneItem.dart';
import 'package:gm_flutter/ClueModel/page/levelOne/LevelOneList.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/levelOne/LevelOneModel.dart';
import 'package:gm_flutter/ClueModel/page/levelTwo/LevelTwoPage.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/BaseComponent.dart';
import 'package:gm_flutter/commonModel/base/BaseState.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/util/DartUtil.dart';
import 'package:gm_flutter/commonModel/view/baseRefreshIndicator.dart'; import 'package:gm_flutter/commonModel/view/baseRefreshIndicator.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'LevelOneBar.dart';
class LevelOnePage extends StatefulWidget { class LevelOnePage extends StatefulWidget {
@override @override
State<StatefulWidget> createState() => LevelOneState(); State<StatefulWidget> createState() => LevelOneState();
} }
class LevelOneState extends BaseState<LevelOnePage> { class LevelOneState extends BaseState<LevelOnePage>
with TickerProviderStateMixin {
int planId = 10; int planId = 10;
LevelOneModel _model = new LevelOneModel(); LevelOneModel _model = new LevelOneModel();
RefreshController _refreshController = RefreshController(); RefreshController _refreshController = RefreshController();
PageController pageController = new PageController();
GlobalKey keyTop = new GlobalKey(); GlobalKey keyTop = new GlobalKey();
GlobalKey key1 = new GlobalKey(); GlobalKey key1 = new GlobalKey();
double screenWidth; double screenWidth;
List<Widget> oneList = new List(); List<Widget> oneList = new List();
int lastPageIndex = 0; int lastPageIndex = 0;
TabController tabController;
int index=0;
static const MethodChannel _methodChannel = MethodChannel('gm_method_channel');
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_methodChannel.invokeMethod("WHAT ","www");
_model.init(() { _model.init(() {
setState(() {}); _initTabBar();
}); });
// pageController.addListener(() {
// if (screenWidth != null) {
// _model.topScrollLive.notifyView(
// pageController.offset / screenWidth * (screenWidth / 4));
// }
// });
} }
void _onScroll(double offset) { void _initTabBar() {
if (offset < 10) { if (tabController != null) {
_model.appBarLive.notifyView(0.0); tabController.removeListener(tabControlerListener);
} 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);
}
}
} }
tabController = TabController(initialIndex: index,length: _model.tabsList.length, vsync: this);
tabController.addListener(tabControlerListener);
setState(() {});
} }
@override @override
void dispose() { void dispose() {
tabController?.removeListener(tabControlerListener);
tabController?.dispose();
_model.dispose(); _model.dispose();
pageController.dispose();
_refreshController.dispose(); _refreshController.dispose();
super.dispose(); super.dispose();
} }
void tabControlerListener() {
if (index != tabController.index) {
index = tabController.index;
}
}
@override @override
Widget buildItem(BuildContext context) { Widget buildItem(BuildContext context) {
oneList.clear(); oneList.clear();
...@@ -117,11 +98,13 @@ class LevelOneState extends BaseState<LevelOnePage> { ...@@ -117,11 +98,13 @@ class LevelOneState extends BaseState<LevelOnePage> {
MediaQuery.of(context).size.height, MediaQuery.of(context).size.height,
_model.stateLive, _model.stateLive,
Container( Container(
child: NestedScrollViewRefreshIndicator( child: BaseNestedScrollViewRefreshIndicator(
onRefresh: () async { onRefresh: () async {
Completer completer = new Completer(); Completer completer = new Completer();
_model.init(() { _model.init(() {
setState(() {}); _initTabBar();
SimpleEventBus.instance()
.notifyListener("LevelOneList", "");
completer.complete(); completer.complete();
}); });
return completer.future; return completer.future;
...@@ -129,7 +112,7 @@ class LevelOneState extends BaseState<LevelOnePage> { ...@@ -129,7 +112,7 @@ class LevelOneState extends BaseState<LevelOnePage> {
child: newHomeWarp()), child: newHomeWarp()),
), () { ), () {
_model.init(() { _model.init(() {
setState(() {}); _initTabBar();
}); });
}))); })));
} }
...@@ -180,48 +163,48 @@ class LevelOneState extends BaseState<LevelOnePage> { ...@@ -180,48 +163,48 @@ class LevelOneState extends BaseState<LevelOnePage> {
List<Widget> list = []; List<Widget> list = [];
var d = MediaQueryData.fromWindow(window).padding.top; var d = MediaQueryData.fromWindow(window).padding.top;
for (int i = 0; i < _model.tabsList.length; i++) { for (int i = 0; i < _model.tabsList.length; i++) {
list.add( list.add(extend.NestedScrollViewInnerScrollPositionKeyWidget(Key("Tab${i}"),
LevelOneList(planId, _model.tabsList[i].tabType, kToolbarHeight + d) LevelOneList(planId, _model.tabsList[i].tabType, kToolbarHeight + d))
.toActive()); );
} }
final double statusBarHeight = MediaQuery.of(context).padding.top; final double statusBarHeight = MediaQuery.of(context).padding.top;
final double pinnedHeaderHeight = statusBarHeight + kToolbarHeight; final double pinnedHeaderHeight = statusBarHeight + kToolbarHeight;
return DefaultTabController( return extend.NestedScrollView(
length: _model.tabsList.length, innerScrollPositionKeyBuilder: () {
child: NestedScrollView( String index = 'Tab${tabController.index.toString()}';
headerSliverBuilder: return Key(index);
(BuildContext context, bool innerBoxIsScrolled) { },
return <Widget>[ headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
SliverOverlapAbsorber( return <Widget>[
handle: NestedScrollView.sliverOverlapAbsorberHandleFor( SliverOverlapAbsorber(
context), handle: extend.NestedScrollView.sliverOverlapAbsorberHandleFor(
sliver: baseSliverAppBar( context),
sliver: baseSliverAppBar(
// _model.imageUrl // _model.imageUrl
"https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w")), "https://pic.igengmei.com/2018/09/11/1513/b7e825a4e4c1-w")),
SliverList( SliverList(
delegate: delegate: SliverChildBuilderDelegate((BuildContext c, int i) {
SliverChildBuilderDelegate((BuildContext c, int i) { if (i == 0) {
if (i == 0) { return Container(
return Container( height: pinnedHeaderHeight,
height: pinnedHeaderHeight, );
); }
} return oneList[i - 1];
return oneList[i - 1]; }, childCount: oneList.length + 1)),
}, childCount: oneList.length + 1)), SliverPersistentHeader(
SliverPersistentHeader( pinned: true,
pinned: true, delegate: StickyTabBarDelegate(
delegate: StickyTabBarDelegate( child: Container(
child: Container( height: 40,
height: 40, color: Colors.white,
color: Colors.white, child: baseTabBar(tabController, getTabs(), (index) {
child: baseTabBar(null, getTabs(), (index) { _model.selectTab(index);
_model.selectTab(index); }, scroll: false),
}, scroll: false), )),
)), ),
), ];
]; },
}, body: TabBarView(controller: tabController, children: list));
body: TabBarView(children: list)));
} }
List<Widget> getTabs() { List<Widget> getTabs() {
...@@ -405,16 +388,6 @@ class LevelOneState extends BaseState<LevelOnePage> { ...@@ -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() { // Widget home() {
// return Column( // return Column(
// children: <Widget>[ // children: <Widget>[
......
...@@ -6,8 +6,11 @@ import 'package:flutter/material.dart'; ...@@ -6,8 +6,11 @@ import 'package:flutter/material.dart';
import 'package:gm_flutter/ClueModel/page/plan/PlanItem.dart'; import 'package:gm_flutter/ClueModel/page/plan/PlanItem.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanFeedBean.dart';
import 'package:gm_flutter/commonModel/base/BaseComponent.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 'package:pull_to_refresh/pull_to_refresh.dart';
import 'TopListModel.dart'; import 'TopListModel.dart';
class TopList extends StatefulWidget { class TopList extends StatefulWidget {
...@@ -20,14 +23,21 @@ class TopList extends StatefulWidget { ...@@ -20,14 +23,21 @@ class TopList extends StatefulWidget {
State<StatefulWidget> createState() => TopListState(); State<StatefulWidget> createState() => TopListState();
} }
class TopListState extends State<TopList> { class TopListState extends State<TopList>
with AutomaticKeepAliveClientMixin{
RefreshController refreshController = RefreshController(); RefreshController refreshController = RefreshController();
TopListModel _model = TopListModel(); TopListModel _model = TopListModel();
Function(String str) refresh;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_model.getData(true); _model.getData(true);
refresh = (str) {
_model.stateLive.notifyView(LOADING);
_model.getData(true);
};
SimpleEventBus.instance().resignEvent("TopList", refresh);
print("${this} INIT"); print("${this} INIT");
} }
...@@ -35,12 +45,14 @@ class TopListState extends State<TopList> { ...@@ -35,12 +45,14 @@ class TopListState extends State<TopList> {
void dispose() { void dispose() {
refreshController.dispose(); refreshController.dispose();
_model.dispose(); _model.dispose();
SimpleEventBus.instance().unResignEvent("TopList", refresh);
print("${this} QUIT"); print("${this} QUIT");
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context);
return baseStateView(MediaQuery.of(context).size.width, return baseStateView(MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height, _model.stateLive, home(), () { MediaQuery.of(context).size.height, _model.stateLive, home(), () {
_model.getData(true); _model.getData(true);
...@@ -54,14 +66,18 @@ class TopListState extends State<TopList> { ...@@ -54,14 +66,18 @@ class TopListState extends State<TopList> {
physics: ClampingScrollPhysics(), physics: ClampingScrollPhysics(),
// shrinkWrap: true, // shrinkWrap: true,
slivers: <Widget>[ slivers: <Widget>[
SliverOverlapInjector( SliverToBoxAdapter(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), child: Container(
height: widget.topHeight,
),
), ),
// extend.SliverOverlapInjector(
// handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
// ),
StreamBuilder<List<Plans>>( StreamBuilder<List<Plans>>(
stream: _model.datasLive.stream, stream: _model.datasLive.stream,
initialData: _model.datas ?? [], initialData: _model.datas ?? [],
builder: (c, data) { builder: (c, data) {
print("LLDATA ${data.data}");
if (data.data.isEmpty && _model.page > 1) { if (data.data.isEmpty && _model.page > 1) {
refreshController.loadNoData(); refreshController.loadNoData();
} else { } else {
...@@ -84,8 +100,8 @@ class TopListState extends State<TopList> { ...@@ -84,8 +100,8 @@ class TopListState extends State<TopList> {
builder: (c, data) { builder: (c, data) {
double height = MediaQuery.of(context).size.height - double height = MediaQuery.of(context).size.height -
40 - 40 -
widget.topHeight - 100 * _model.datas.length
100 * _model.datas.length; ;
return SliverToBoxAdapter( return SliverToBoxAdapter(
child: Container( child: Container(
height: height < 0 ? 0 : height, height: height < 0 ? 0 : height,
...@@ -98,4 +114,7 @@ class TopListState extends State<TopList> { ...@@ -98,4 +114,7 @@ class TopListState extends State<TopList> {
_model.loadMore(); _model.loadMore();
}, pullDown: false, pullUp: true); }, pullDown: false, pullUp: true);
} }
@override
bool get wantKeepAlive => true;
} }
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
* @author lsy * @author lsy
* @date 2020/7/2 * @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/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:flutter_common/commonModel/toast/NativeToast.dart';
...@@ -40,7 +42,7 @@ class TopModel extends BaseModel { ...@@ -40,7 +42,7 @@ class TopModel extends BaseModel {
tabIndex = index; tabIndex = index;
} }
void init(Function(int size) back) { void init(VoidCallback back) {
ClueApiImpl.getInstance() ClueApiImpl.getInstance()
.getPlanBar(DioUtil.getInstance().getDio(), rank_type) .getPlanBar(DioUtil.getInstance().getDio(), rank_type)
.listen((event) { .listen((event) {
...@@ -48,7 +50,7 @@ class TopModel extends BaseModel { ...@@ -48,7 +50,7 @@ class TopModel extends BaseModel {
stateLive.notifyView(ENDLOADING); stateLive.notifyView(ENDLOADING);
imageUrl = event.data.bannerImage; imageUrl = event.data.bannerImage;
tabs = event.data.tabs; tabs = event.data.tabs;
back(tabs.length); back();
} else { } else {
NativeToast.showNativeToast(event.message); NativeToast.showNativeToast(event.message);
stateLive.notifyView(FAIL); stateLive.notifyView(FAIL);
......
...@@ -3,16 +3,21 @@ ...@@ -3,16 +3,21 @@
* @date 2020/7/2 * @date 2020/7/2
**/ **/
import 'dart:async';
import 'dart:ui'; import 'dart:ui';
import 'package:flutter/cupertino.dart'; 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: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/ClueModel/util/PosUtil.dart'; import 'package:gm_flutter/ClueModel/util/PosUtil.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/eventbus/SimpleEventBus.dart';
import 'package:gm_flutter/commonModel/util/DartUtil.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 'package:pull_to_refresh/pull_to_refresh.dart';
import 'TopList.dart'; import 'TopList.dart';
...@@ -25,7 +30,8 @@ class TopPage extends StatefulWidget { ...@@ -25,7 +30,8 @@ class TopPage extends StatefulWidget {
class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin { class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
RefreshController refreshController = RefreshController(); RefreshController refreshController = RefreshController();
TopModel _model = TopModel(); TopModel _model = TopModel();
GlobalKey globalKey = GlobalKey(); int index = 0;
TabController tabController;
@override @override
void initState() { void initState() {
...@@ -34,18 +40,30 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin { ...@@ -34,18 +40,30 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
} }
void init() { void init() {
_model.init((i) { _model.init(() {
setState(() {}); _initTabBar();
}); });
} }
@override @override
void dispose() { void dispose() {
_model.dispose(); _model.dispose();
tabController?.removeListener(tabControlerListener);
tabController?.dispose();
refreshController.dispose(); refreshController.dispose();
super.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 @override
Widget buildItem(BuildContext context) { Widget buildItem(BuildContext context) {
return Scaffold( return Scaffold(
...@@ -53,84 +71,99 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin { ...@@ -53,84 +71,99 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
MediaQuery.of(context).size.width, MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height, MediaQuery.of(context).size.height,
_model.stateLive, _model.stateLive,
Stack( Container(
children: <Widget>[ child: BaseNestedScrollViewRefreshIndicator(
Container( onRefresh: () async {
width: MediaQuery.of(context).size.width, Completer completer = new Completer();
height: MediaQuery.of(context).size.height, _model.init(() {
child: NotificationListener( _initTabBar();
onNotification: (scrollNotification) { SimpleEventBus.instance().notifyListener("TopList", "");
if (scrollNotification is KeepAliveNotification || completer.complete();
scrollNotification is OverscrollIndicatorNotification) { });
return false; return completer.future;
} },
if (scrollNotification is ScrollUpdateNotification && child: homeWarp()),
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)
],
), () { ), () {
init(); 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() { Widget home() {
List<Widget> list = []; List<Widget> list = [];
var d = MediaQueryData.fromWindow(window).padding.top; var d = MediaQueryData.fromWindow(window).padding.top;
for (int i = 0; i < _model.tabs.length; i++) { 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( return extend.NestedScrollView(
length: _model.tabs.length, innerScrollPositionKeyBuilder: () {
child: NestedScrollView( String index = 'Tab${tabController.index.toString()}';
headerSliverBuilder: return Key(index);
(BuildContext context, bool innerBoxIsScrolled) { },
return <Widget>[ headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
SliverOverlapAbsorber( return <Widget>[
handle: NestedScrollView.sliverOverlapAbsorberHandleFor( SliverOverlapAbsorber(
context), handle: extend.NestedScrollView.sliverOverlapAbsorberHandleFor(
sliver: baseSliverAppBar(_model.imageUrl)), context),
SliverPersistentHeader( sliver: baseSliverAppBar(_model.imageUrl)),
pinned: true, SliverPersistentHeader(
delegate: StickyTabBarDelegate( pinned: true,
child: Container( delegate: StickyTabBarDelegate(
height: 40, child: Container(
color: Colors.white, height: 40,
child: baseTabBar(null, getTabs(), (index) { color: Colors.white,
_model.selectTab(index); child: baseTabBar(tabController, getTabs(), (index) {
}), _model.selectTab(index);
)), }),
), )),
]; ),
}, ];
body: TabBarView(children: list))); },
body: TabBarView(controller: tabController, children: list));
} }
List<Widget> getTabs() { List<Widget> getTabs() {
...@@ -142,4 +175,10 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin { ...@@ -142,4 +175,10 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
} }
return list; return list;
} }
void tabControlerListener() {
if (index != tabController.index) {
index = tabController.index;
}
}
} }
...@@ -4,9 +4,10 @@ ...@@ -4,9 +4,10 @@
**/ **/
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_boost/flutter_boost.dart'; import 'package:flutter_boost/flutter_boost.dart';
import 'package:gm_flutter/commonModel/base/BaseUtil.dart';
class MainManager { class MainManager {
static const EventChannel _channel = EventChannel("flutter_plugin_event");
MainManager._() {} MainManager._() {}
...@@ -20,8 +21,9 @@ class MainManager { ...@@ -20,8 +21,9 @@ class MainManager {
} }
startInit() { startInit() {
_channel.receiveBroadcastStream().listen((data) { flutterEvent.receiveBroadcastStream().listen((data) {
print("LSY FLUTTER EVENT ${data}"); print("LSY FLUTTER EVENT ${data}");
}); });
flutterChannel.invokeMethod("WHAT ","www");
} }
} }
...@@ -15,6 +15,7 @@ import 'package:gm_flutter/commonModel/GMBase.dart'; ...@@ -15,6 +15,7 @@ import 'package:gm_flutter/commonModel/GMBase.dart';
import 'package:gm_flutter/commonModel/bean/Pair.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/baseRefreshIndicator.dart';
import 'package:gm_flutter/commonModel/view/baseTabIndicator.dart'; import 'package:gm_flutter/commonModel/view/baseTabIndicator.dart';
import 'package:lottie/lottie.dart'; import 'package:lottie/lottie.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
...@@ -378,7 +379,7 @@ Widget normalRefreshHeader() { ...@@ -378,7 +379,7 @@ Widget normalRefreshHeader() {
Widget emptyItem(double width, double height, {String detail,double paddingTop}) { Widget emptyItem(double width, double height, {String detail,double paddingTop}) {
return Container( return Container(
padding: EdgeInsets.only(top: paddingTop), padding: EdgeInsets.only(top: paddingTop??0),
width: width, width: width,
height: height, height: height,
color: Colors.white, color: Colors.white,
......
...@@ -9,4 +9,5 @@ import 'package:flutter/material.dart'; ...@@ -9,4 +9,5 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
const flutterChannel = const MethodChannel('gm_method_channel'); 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");
/*
* @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
...@@ -79,13 +79,13 @@ enum _RefreshIndicatorMode { ...@@ -79,13 +79,13 @@ enum _RefreshIndicatorMode {
/// Must be used as a sliver inside a [CustomScrollView] instead of wrapping /// 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 /// around a [ScrollView] because it's a part of the scrollable instead of
/// being overlaid on top of it. /// being overlaid on top of it.
class NestedScrollViewRefreshIndicator extends StatefulWidget { class BaseNestedScrollViewRefreshIndicator extends StatefulWidget {
/// Creates a refresh indicator. /// Creates a refresh indicator.
/// ///
/// The [onRefresh], [child], and [notificationPredicate] arguments must be /// The [onRefresh], [child], and [notificationPredicate] arguments must be
/// non-null. The default /// non-null. The default
/// [displacement] is 40.0 logical pixels. /// [displacement] is 40.0 logical pixels.
const NestedScrollViewRefreshIndicator({ const BaseNestedScrollViewRefreshIndicator({
Key key, Key key,
@required this.child, @required this.child,
this.displacement = 55.0, this.displacement = 55.0,
...@@ -150,8 +150,8 @@ class NestedScrollViewRefreshIndicator extends StatefulWidget { ...@@ -150,8 +150,8 @@ class NestedScrollViewRefreshIndicator extends StatefulWidget {
/// Contains the state for a [NestedScrollViewRefreshIndicator]. This class can be used to /// Contains the state for a [NestedScrollViewRefreshIndicator]. This class can be used to
/// programmatically show the refresh indicator, see the [show] method. /// programmatically show the refresh indicator, see the [show] method.
class NestedScrollViewRefreshIndicatorState class NestedScrollViewRefreshIndicatorState
extends State<NestedScrollViewRefreshIndicator> extends State<BaseNestedScrollViewRefreshIndicator>
with TickerProviderStateMixin<NestedScrollViewRefreshIndicator> { with TickerProviderStateMixin<BaseNestedScrollViewRefreshIndicator> {
AnimationController _positionController; AnimationController _positionController;
Animation<double> _positionFactor; Animation<double> _positionFactor;
Animation<double> _value; Animation<double> _value;
......
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_boost/flutter_boost.dart'; import 'package:flutter_boost/flutter_boost.dart';
import 'package:flutter_common/Annotations/anno/RouterCenter.dart'; import 'package:flutter_common/Annotations/anno/RouterCenter.dart';
import 'package:flutter_common/commonModel/util/WindowUtil.dart'; import 'package:flutter_common/commonModel/util/WindowUtil.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:gm_flutter/main.mark.dart'; import 'package:gm_flutter/main.mark.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart'; import 'package:gm_flutter/ClueModel/page/PlanCompareDetail/PlanCompareDetailPage.dart';
...@@ -37,7 +39,7 @@ void main() { ...@@ -37,7 +39,7 @@ void main() {
SharedPreferences.getInstance().then((value) { SharedPreferences.getInstance().then((value) {
sharedPreferences = value; sharedPreferences = value;
}); });
RouterCenterImpl().findMainRouter().init(); // RouterCenterImpl().findMainRouter().init();
}, (Object error, StackTrace stack) { }, (Object error, StackTrace stack) {
//TODO //TODO
print("lsy EEEEEE ${error.toString()} ${stack.toString()}"); print("lsy EEEEEE ${error.toString()} ${stack.toString()}");
...@@ -58,7 +60,7 @@ class MyApp extends State<MyAppWidget> { ...@@ -58,7 +60,7 @@ class MyApp extends State<MyAppWidget> {
super.initState(); super.initState();
FlutterBoost.singleton.registerPageBuilders({ FlutterBoost.singleton.registerPageBuilders({
'demoPage': (pageName, params, _) { 'demoPage': (pageName, params, _) {
return DemoPage(); return RouterCenterImpl().findClueRouter().getLevelOnePage();
}, },
'demoPage1': (pageName, params, _) { 'demoPage1': (pageName, params, _) {
return DemoPage1(); return DemoPage1();
...@@ -67,30 +69,30 @@ class MyApp extends State<MyAppWidget> { ...@@ -67,30 +69,30 @@ class MyApp extends State<MyAppWidget> {
FlutterBoost.singleton FlutterBoost.singleton
.addBoostContainerLifeCycleObserver((state, settings) { .addBoostContainerLifeCycleObserver((state, settings) {
print("LSY ${state}"); 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()); // FlutterBoost.singleton.addBoostNavigatorObserver(TestBoostNavigatorObserver());
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
WindowUtil.setBarStatus(true); WindowUtil.setBarStatus(false);
return MaterialApp( return MaterialApp(
theme: ThemeData( theme: ThemeData(
primaryColor: Colors.white, primaryColor: Colors.white,
cursorColor: Color(0xff20BDBB), cursorColor: Color(0xff20BDBB),
highlightColor:Colors.transparent, highlightColor: Colors.transparent,
splashColor:Colors.transparent, splashColor: Colors.transparent,
canvasColor: Colors.white), canvasColor: Colors.white),
builder: FlutterBoost.init(postPush: _onRoutePushed), builder: FlutterBoost.init(postPush: _onRoutePushed),
home: isDebug home: Home());
? RouterCenterImpl().findMainRouter().getTestPage()
: Container(
color: Colors.white,
child: Center(
child: loadingItem(),
),
));
} }
void _onRoutePushed( void _onRoutePushed(
...@@ -101,3 +103,23 @@ class MyApp extends State<MyAppWidget> { ...@@ -101,3 +103,23 @@ class MyApp extends State<MyAppWidget> {
Future<dynamic> _, 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(),
),
);
}
}
...@@ -262,6 +262,13 @@ packages: ...@@ -262,6 +262,13 @@ packages:
url: "https://github.com/asd451398533/flutter_common.git" url: "https://github.com/asd451398533/flutter_common.git"
source: git source: git
version: "0.0.1" 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: flutter_svg:
dependency: transitive dependency: transitive
description: description:
......
...@@ -34,6 +34,8 @@ dependencies: ...@@ -34,6 +34,8 @@ dependencies:
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 extended_nested_scroll_view: ^1.0.0
#适配库
flutter_screenutil: ^1.1.0
dev_dependencies: dev_dependencies:
......
#!/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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment