Commit 4814802c authored by 杜欣's avatar 杜欣

二级方案

parent 21f25c43
import 'package:flutter/material.dart';
class StickyTabBarDelegate extends SliverPersistentHeaderDelegate {
final Widget child;
StickyTabBarDelegate({@required this.child});
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
return this.child;
}
@override
double get maxExtent => 40;
@override
double get minExtent => 40;
@override
bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
return true;
}
}
...@@ -25,7 +25,7 @@ class LevelOneList extends StatefulWidget { ...@@ -25,7 +25,7 @@ class LevelOneList extends StatefulWidget {
} }
class LevelOneListState extends State<LevelOneList> class LevelOneListState extends State<LevelOneList>
with AutomaticKeepAliveClientMixin{ with AutomaticKeepAliveClientMixin {
LevelOneListModel _model = LevelOneListModel(); LevelOneListModel _model = LevelOneListModel();
RefreshController refreshController = RefreshController(); RefreshController refreshController = RefreshController();
...@@ -83,7 +83,7 @@ class LevelOneListState extends State<LevelOneList> ...@@ -83,7 +83,7 @@ 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){ if (index == _model.data.length) {
return Container( return Container(
height: 40, height: 40,
color: Color(0xffF7F6FA), color: Color(0xffF7F6FA),
...@@ -91,7 +91,7 @@ class LevelOneListState extends State<LevelOneList> ...@@ -91,7 +91,7 @@ class LevelOneListState extends State<LevelOneList>
} }
return LevelOneItem(_model.data[index]); return LevelOneItem(_model.data[index]);
}, },
childCount: _model.data.length+1, childCount: _model.data.length + 1,
), ),
); );
}, },
......
...@@ -11,9 +11,9 @@ import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart' ...@@ -11,9 +11,9 @@ import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gm_flutter/ClueModel/page/common/StickyTabBarDelegate.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/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/base/BaseUtil.dart'; import 'package:gm_flutter/commonModel/base/BaseUtil.dart';
......
...@@ -7,72 +7,50 @@ import 'package:flutter_common/commonModel/live/BaseModel.dart'; ...@@ -7,72 +7,50 @@ 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';
import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart'; import 'package:gm_flutter/ClueModel/server/api/ClueApi.serv.dart';
import 'package:gm_flutter/ClueModel/server/entity/LevelOneFeedList.dart'; import 'package:gm_flutter/ClueModel/server/entity/PlanOverViewBean.dart';
import 'package:gm_flutter/ClueModel/server/entity/PlanOverviewBean.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/rx/RxDispose.dart'; import 'package:gm_flutter/commonModel/rx/RxDispose.dart';
import 'package:gm_flutter/commonModel/util/PrintUtil.dart'; import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart';
import '../../../commonModel/bean/Pair.dart';
class LevelTwoModel extends BaseModel {
LiveData<Pair<int, String>> nameLive = LiveData();
LiveData<Pair<int, String>> imageUrlLive = LiveData();
LiveData<Pair<int, List<OverviewAttrsEntity>>> overviewAttrsLive = LiveData();
LiveData<Pair<int, List<ExplanationAttrsEntity>>> explanationAttrsLive =
LiveData();
LiveData<Pair<int, List<Tabs>>> tabsLive = LiveData();
class LevelOneModel extends BaseModel {
LiveData<int> stateLive = LiveData(); LiveData<int> stateLive = LiveData();
LiveData<Pair<int, List<Cards>>> cardsLive = LiveData(); LiveData<double> textLive = LiveData();
RxDispose rxDispose = RxDispose(); RxDispose rxDispose = RxDispose();
getPlanOverview(int plan_id) { List<Tabs> tabsList = [];
int plan_id = 0;
PlanOverData planoverItem;
void init(VoidCallback callback) {
ClueApiImpl.getInstance() ClueApiImpl.getInstance()
.getPlanOverviewBean(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;
tabsList = event.data.tabs;
stateLive.notifyView(ENDLOADING); stateLive.notifyView(ENDLOADING);
nameLive.notifyView(Pair(ENDLOADING, event.data.name)); callback();
imageUrlLive
.notifyView(Pair(ENDLOADING, event.data.banner.imageUrl));
overviewAttrsLive
.notifyView(Pair(ENDLOADING, event.data.overviewAttrs));
explanationAttrsLive
.notifyView(Pair(ENDLOADING, event.data.explanationAttrs));
tabsLive.notifyView(Pair(ENDLOADING, event.data.tabs));
} else { } else {
NativeToast.showNativeToast(event.message); NativeToast.showNativeToast(event.message);
commonError(); stateLive.notifyView(FAIL);
} }
}) })
.addToDispose(rxDispose) .addToDispose(rxDispose)
.onError((err) { .onError((err) {
commonError();
PrintUtil.printBug(err); PrintUtil.printBug(err);
stateLive.notifyView(FAIL);
}); });
} }
commonError() { int currentIndex = 0;
stateLive.notifyView(FAIL);
nameLive.notifyView(Pair(FAIL, null));
imageUrlLive.notifyView(Pair(FAIL, null));
overviewAttrsLive.notifyView(Pair(FAIL, null));
explanationAttrsLive.notifyView(Pair(FAIL, null));
tabsLive.notifyView(Pair(FAIL, null));
}
@override @override
void dispose() { void dispose() {
nameLive.dispost();
imageUrlLive.dispost();
overviewAttrsLive.dispost();
explanationAttrsLive.dispost();
tabsLive.dispost();
stateLive.dispost(); stateLive.dispost();
rxDispose.dispose(); textLive.dispost();
} }
void loadMore() {} void selectTab(int index) {}
} }
...@@ -25,30 +25,6 @@ class MechanismBox implements IBottomPicker { ...@@ -25,30 +25,6 @@ class MechanismBox implements IBottomPicker {
} }
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder(
stream: _model.stateLive.stream,
initialData: _model.stateLive.data ?? LOADING,
builder: (c, data) {
if (data.data == FAIL) {
return errorItem(MediaQuery.of(context).size.width,
MediaQuery.of(context).size.height, () {
_model.getQuestions(plan_id);
});
}
if (data.data == LOADING) {
return loadingItem();
}
return setupHome(context);
},
);
}
@override
void dispose() {
textController.dispose();
}
setupHome(context) {
MediaQueryData mq = MediaQuery.of(context); MediaQueryData mq = MediaQuery.of(context);
double keyHeight = MediaQuery.of(context).viewInsets.bottom; double keyHeight = MediaQuery.of(context).viewInsets.bottom;
return ClipRRect( return ClipRRect(
...@@ -58,17 +34,41 @@ class MechanismBox implements IBottomPicker { ...@@ -58,17 +34,41 @@ class MechanismBox implements IBottomPicker {
width: mq.size.width, width: mq.size.width,
height: mq.size.height - 140, height: mq.size.height - 140,
color: Colors.white, color: Colors.white,
child: Column( child: StreamBuilder(
mainAxisSize: MainAxisSize.max, stream: _model.stateLive.stream,
children: <Widget>[ initialData: _model.stateLive.data ?? LOADING,
title(mq), builder: (c, data) {
mechanismList(mq, keyHeight), if (data.data == FAIL) {
bottomMessage() return errorItem(MediaQuery.of(context).size.width,
], MediaQuery.of(context).size.height, () {
_model.getQuestions(plan_id);
});
}
if (data.data == LOADING) {
return loadingItem();
}
return setupHome(mq, keyHeight);
},
)), )),
); );
} }
@override
void dispose() {
textController.dispose();
}
setupHome(mq, keyHeight) {
return Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
title(mq),
mechanismList(mq, keyHeight),
bottomMessage()
],
);
}
// 弹窗标题 // 弹窗标题
Widget title(mq) { Widget title(mq) {
return Container( return Container(
...@@ -217,16 +217,14 @@ class MechanismBox implements IBottomPicker { ...@@ -217,16 +217,14 @@ class MechanismBox implements IBottomPicker {
fontSize: 12), fontSize: 12),
)), )),
Expanded( Expanded(
child: StreamBuilder<Pair<int, List<String>>>( child: StreamBuilder<List<String>>(
stream: _model.questionsLive.stream, stream: _model.questionsLive.stream,
initialData: _model.questionsLive.data ?? null, initialData: _model.questionsLive.data ?? null,
builder: (c, e) { builder: (c, e) {
print('dssdadsadas');
print(e.data.toString());
if (e.data == null) { if (e.data == null) {
return Container(); return Container();
} }
List<String> questions = e.data.second; List<String> questions = e.data;
return ListView.builder( return ListView.builder(
scrollDirection: Axis.horizontal, //横向滚动 scrollDirection: Axis.horizontal, //横向滚动
itemBuilder: (c, index) { itemBuilder: (c, index) {
...@@ -286,11 +284,10 @@ class MechanismBox implements IBottomPicker { ...@@ -286,11 +284,10 @@ class MechanismBox implements IBottomPicker {
NativeToast.showNativeToast('text'); NativeToast.showNativeToast('text');
} else { } else {
_model.sendMessage(doctor_ids, txt, plan_id); _model.sendMessage(doctor_ids, txt, plan_id);
dismissCall();
textController.text = '';
NativeToast.showNativeToast('消息已发送成功');
} }
// dismissCall();
// textController.text = '';
// NativeToast.showNativeToast('消息已发送成功');
} }
}, },
style: TextStyle(fontSize: 12), style: TextStyle(fontSize: 12),
......
...@@ -15,7 +15,7 @@ import 'package:gm_flutter/commonModel/util/PrintUtil.dart'; ...@@ -15,7 +15,7 @@ import 'package:gm_flutter/commonModel/util/PrintUtil.dart';
import 'package:gm_flutter/commonModel/bean/Pair.dart'; import 'package:gm_flutter/commonModel/bean/Pair.dart';
class MechanismModel extends BaseModel { class MechanismModel extends BaseModel {
LiveData<Pair<int, List<String>>> questionsLive = LiveData(); LiveData<List<String>> questionsLive = LiveData();
LiveData<int> stateLive = LiveData(); LiveData<int> stateLive = LiveData();
LiveData messageLive = LiveData(); LiveData messageLive = LiveData();
...@@ -27,17 +27,17 @@ class MechanismModel extends BaseModel { ...@@ -27,17 +27,17 @@ class MechanismModel extends BaseModel {
.listen((event) { .listen((event) {
if (event.error == 0) { if (event.error == 0) {
stateLive.notifyView(ENDLOADING); stateLive.notifyView(ENDLOADING);
questionsLive.notifyView(Pair(ENDLOADING, event.data.questions)); questionsLive.notifyView(event.data.questions);
} else { } else {
stateLive.notifyView(FAIL); stateLive.notifyView(FAIL);
questionsLive.notifyView(Pair(FAIL, null)); questionsLive.notifyView(null);
NativeToast.showNativeToast(event.message); NativeToast.showNativeToast(event.message);
} }
}) })
.addToDispose(rxDispose) .addToDispose(rxDispose)
.onError((err) { .onError((err) {
stateLive.notifyView(FAIL); stateLive.notifyView(FAIL);
questionsLive.notifyView(Pair(FAIL, null)); questionsLive.notifyView(null);
PrintUtil.printBug(err); PrintUtil.printBug(err);
}); });
} }
......
...@@ -10,7 +10,7 @@ import 'package:flutter/cupertino.dart'; ...@@ -10,7 +10,7 @@ import 'package:flutter/cupertino.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart' import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'
as extend; 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/common/StickyTabBarDelegate.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';
...@@ -136,8 +136,8 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin { ...@@ -136,8 +136,8 @@ class TopPageState extends BaseState<TopPage> with TickerProviderStateMixin {
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(extend.NestedScrollViewInnerScrollPositionKeyWidget(Key("Tab${i}"), list.add(extend.NestedScrollViewInnerScrollPositionKeyWidget(
TopList(_model.tabs[i].id, kToolbarHeight + d))); Key("Tab${i}"), TopList(_model.tabs[i].id, kToolbarHeight + d)));
} }
return extend.NestedScrollView( return extend.NestedScrollView(
innerScrollPositionKeyBuilder: () { innerScrollPositionKeyBuilder: () {
......
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