From 8ec0fe19e887a162b57fb1001b8fba2f763ec218 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 17 Apr 2020 15:14:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E5=85=A5=E6=94=B6=E8=97=8F=E9=A1=B5?= =?UTF-8?q?=EF=BC=8C=E5=86=8D=E5=9B=9E=E5=88=B0=E9=A6=96=E9=A1=B5=EF=BC=8C?= =?UTF-8?q?=E9=A1=B6=E9=83=A8=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82fix--=E4=B8=BB=E9=A1=B5item?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=E9=BB=91=E5=B1=8F=E9=97=AE=E9=A2=98.?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AF=A6=E6=83=85=E9=A1=B5=E3=80=90=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=93=BE=E6=8E=A5=E7=9A=84=E6=A0=88=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=80=91,?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 622592 -> 622592 bytes lib/app/router.dart | 2 +- lib/views/pages/collect/collect_page.dart | 2 +- .../pages/detail/widget_detail_page.dart | 285 +++++++++++------- lib/views/pages/home/home_page.dart | 7 +- lib/views/pages/home/toly_app_bar.dart | 7 +- lib/views/pages/search/serach_page.dart | 3 +- 7 files changed, 195 insertions(+), 111 deletions(-) diff --git a/assets/flutter.db b/assets/flutter.db index 033908c3a3dc1734c290fd72e2b22f6a7ce85dff..247282f76481113aad9c61ecd639ea52d5c6f724 100644 GIT binary patch delta 107 zcmZo@P-|#Vn;^|7JW;P$(i%^F>-F!n17!INO3ILrUj(-pWDs>q{^@V vV+B%Wch52cDVO^l%8Z=tXPFp*m-k$(i%^F>-9yn17!INO3ILrUj(-pWDs>q{^@V vV+B%Wch52cDVO^l%8VTCXPFp*m(context).add(FetchWidgetDetail(model)); - Navigator.pushNamed(context, Router.widget_detail); + Navigator.pushNamed(context, Router.widget_detail,arguments: model); } } diff --git a/lib/views/pages/detail/widget_detail_page.dart b/lib/views/pages/detail/widget_detail_page.dart index d4e107c..ad64e49 100644 --- a/lib/views/pages/detail/widget_detail_page.dart +++ b/lib/views/pages/detail/widget_detail_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:flutter_unit/app/res/cons.dart'; +import 'package:flutter_unit/app/router.dart'; import 'package:flutter_unit/app/style/TolyIcon.dart'; import 'package:flutter_unit/app/utils/Toast.dart'; import 'package:flutter_unit/blocs/collect/collect_bloc.dart'; @@ -19,77 +20,206 @@ import 'package:flutter_unit/model/widget_model.dart'; import 'package:flutter_unit/views/widgets/widgets_map.dart'; class WidgetDetailPage extends StatefulWidget { + final WidgetModel model; + + WidgetDetailPage({this.model}); + @override _WidgetDetailPageState createState() => _WidgetDetailPageState(); } class _WidgetDetailPageState extends State { + WidgetModel _model; + + List _models=[]; + @override void deactivate() { BlocProvider.of(context).add(ResetDetailState()); super.deactivate(); } + @override + void initState() { + _models.add(widget.model); + super.initState(); + } + @override Widget build(BuildContext context) { - return BlocBuilder(builder: (_, state) { - if (state is DetailWithData) { - return WillPopScope( - onWillPop: () async { -// Future.delayed(Duration(milliseconds: 500)).then((v){ -// BlocProvider.of(context).add(ResetDetailState()); -// }); - return true; - }, - child: Scaffold( - appBar: AppBar( - title: Text(state.widgetModel.name), - actions: [ - buildCollectButton(state.widgetModel, context), - ], - ), - body: SingleChildScrollView( - child: Container( + return WillPopScope( + onWillPop: () async{ + _models.removeLast(); + if(_models.length>0){ + setState(() { + + }); + return false; + }else{ + return true; + } + }, + child: Scaffold( + appBar: AppBar( + title: Text(_models.last.name), + actions: [ + IconButton(icon:Icon( Icons.home), onPressed: (){ + Navigator.of(context).pop(); + }), + buildCollectButton(_models.last, context), + + ], + ), + body: SingleChildScrollView( + child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - _buildLeft(state.widgetModel), - _buildRight(state.widgetModel), - ], + WidgetDetailTitle( + model: _models.last, ), - Divider(), - Row( - children: [ - Padding( - padding: const EdgeInsets.only(left: 15, right: 5), - child: Icon( - Icons.link, - color: Colors.blue, - ), - ), - Text( - '相关组件', - style: TextStyle( - fontWeight: FontWeight.bold, fontSize: 16), - ), - ], - ), - _buildLinkTo( - context, - state.links, - ), - Divider(), - _buildNodes(state.nodes, state.widgetModel.name) + BlocBuilder(builder: (_, state) { + if (state is DetailWithData) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Padding( + padding: + const EdgeInsets.only(left: 15, right: 5), + child: Icon( + Icons.link, + color: Colors.blue, + ), + ), + Text( + '相关组件', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 16), + ), + ], + ), + _buildLinkTo( + context, + state.links, + ), + Divider(), + _buildNodes(state.nodes, state.widgetModel.name) + ], + ); + } + return Container(); + }) ], ), - )), - ), - ); - } - return Container(); - }); + ), + )), + ); + } + + Widget buildCollectButton(WidgetModel model, BuildContext context) { + //监听 CollectBloc 伺机弹出toast + return BlocListener( + listener: (ctx, st) { + bool collected = st.widgets.contains(model); + Toast.toast(ctx, + collected ? "收藏【${model.name}】组件成功!" : "已取消【${model.name}】组件收藏!"); + }, + child: FeedbackWidget( + onPressed: () => BlocProvider.of(context) + .add(ToggleCollectEvent(id: model.id)), + child: BlocBuilder(builder: (_, s) { + return Padding( + padding: const EdgeInsets.only(right: 20.0), + child: Icon( + s.widgets.contains(model) + ? TolyIcon.icon_star_ok + : TolyIcon.icon_star_add, + size: 25, + ), + ); + }), + )); + } + + final List colors = Cons.tabColors; + + Widget _buildNodes(List nodes, String name) { + var globalState = BlocProvider.of(context).state; + + return Column( + children: nodes + .asMap() + .keys + .map((i) => WidgetNodePanel( + codeStyle: Cons.codeThemeSupport.keys + .toList()[globalState.codeStyleIndex], + codeFamily: 'Inconsolata', + text: nodes[i].name, + subText: nodes[i].subtitle, + code: nodes[i].code, + show: WidgetsMap.map(name)[i], + )) + .toList()); + } + + _buildLinkTo(BuildContext context, List links) { + if (links == null || links.isEmpty) { + return Padding( + padding: EdgeInsets.only(left: 10), + child: Chip( + backgroundColor: Colors.grey.withAlpha(120), + labelStyle: TextStyle(fontSize: 12, color: Colors.white), + label: Text('暂无链接组件'), + )); + } else { + return Padding( + padding: const EdgeInsets.only(left: 10.0, top: 10), + child: Wrap( + spacing: 5, + children: links + .map((e) => ActionChip( + onPressed: () { + BlocProvider.of(context) + .add(FetchWidgetDetail(e)); + setState(() { + _models.add(e); + }); + }, + elevation: 2, + shadowColor: Colors.orange, + backgroundColor: Theme.of(context).primaryColor, + labelStyle: TextStyle(fontSize: 12, color: Colors.white), + label: Text('${e.name}'), + )) + .toList(), + ), + ); + } + } +} + +class WidgetDetailTitle extends StatelessWidget { + final WidgetModel model; + + WidgetDetailTitle({this.model}); + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + _buildLeft(model), + _buildRight(model), + ], + ), + Divider(), + ], + )); } Widget buildCollectButton(WidgetModel model, BuildContext context) { @@ -163,55 +293,4 @@ class _WidgetDetailPageState extends State { ) ], ); - - Widget _buildNodes(List nodes, String name) { - var globalState = BlocProvider.of(context).state; - - return Column( - children: nodes - .asMap() - .keys - .map((i) => WidgetNodePanel( - codeStyle: Cons.codeThemeSupport.keys - .toList()[globalState.codeStyleIndex], - codeFamily: 'Inconsolata', - text: nodes[i].name, - subText: nodes[i].subtitle, - code: nodes[i].code, - show: WidgetsMap.map(name)[i], - )) - .toList()); - } - - _buildLinkTo(BuildContext context, List links) { - if (links == null || links.isEmpty) { - return Padding( - padding: EdgeInsets.only(left: 10), - child: Chip( - backgroundColor: Colors.grey.withAlpha(120), - labelStyle: TextStyle(fontSize: 12, color: Colors.white), - label: Text('暂无链接组件'), - )); - } else { - return Padding( - padding: const EdgeInsets.only(left: 10.0, top: 10), - child: Wrap( - spacing: 5, - children: links - .map((e) => ActionChip( - onPressed: () { - BlocProvider.of(context) - .add(FetchWidgetDetail(e)); - }, - elevation: 2, - shadowColor: Colors.orange, - backgroundColor: Theme.of(context).primaryColor, - labelStyle: TextStyle(fontSize: 12, color: Colors.white), - label: Text('${e.name}'), - )) - .toList(), - ), - ); - } - } } diff --git a/lib/views/pages/home/home_page.dart b/lib/views/pages/home/home_page.dart index 277235a..90a41b7 100644 --- a/lib/views/pages/home/home_page.dart +++ b/lib/views/pages/home/home_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/convert.dart'; +import 'package:flutter_unit/app/res/cons.dart'; import 'package:flutter_unit/app/router.dart'; import 'package:flutter_unit/blocs/detail/detail_bloc.dart'; import 'package:flutter_unit/blocs/detail/detail_event.dart'; @@ -36,8 +37,11 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { + var color = BlocProvider.of(context).state.homeColor; + return Scaffold( appBar: TolyAppBar( + selectIndex: Cons.tabColors.indexOf(color.value), preferredSize: Size.fromHeight(_height), onItemClick: _switchTab, ), @@ -119,7 +123,6 @@ class _HomePageState extends State { _toDetailPage(WidgetModel model) async{ BlocProvider.of(context).add(FetchWidgetDetail(model)); - await Future.delayed(Duration(milliseconds: 200)); - Navigator.pushNamed(context, Router.widget_detail); + Navigator.pushNamed(context, Router.widget_detail,arguments: model); } } diff --git a/lib/views/pages/home/toly_app_bar.dart b/lib/views/pages/home/toly_app_bar.dart index 89b2d84..cd82061 100644 --- a/lib/views/pages/home/toly_app_bar.dart +++ b/lib/views/pages/home/toly_app_bar.dart @@ -10,7 +10,8 @@ class TolyAppBar extends StatefulWidget implements PreferredSizeWidget { final Size preferredSize; - TolyAppBar({this.onItemClick, this.preferredSize,}); + final int selectIndex; + TolyAppBar({this.onItemClick, this.preferredSize,this.selectIndex=0}); } class _TolyAppBarState extends State @@ -24,6 +25,8 @@ class _TolyAppBarState extends State AnimationController _controller; + + @override void initState() { _controller = @@ -34,7 +37,7 @@ class _TolyAppBarState extends State setState(() {}); } }); - + _selectIndex=widget.selectIndex; super.initState(); } diff --git a/lib/views/pages/search/serach_page.dart b/lib/views/pages/search/serach_page.dart index d98f00b..3e88146 100644 --- a/lib/views/pages/search/serach_page.dart +++ b/lib/views/pages/search/serach_page.dart @@ -130,7 +130,6 @@ class _SearchPageState extends State { _toDetailPage(WidgetModel model) { BlocProvider.of(context).add(FetchWidgetDetail(model)); -// BlocProvider.of(context).add(EventSetCollect(collect:model.collected)); - Navigator.pushNamed(context, Router.widget_detail); + Navigator.pushNamed(context, Router.widget_detail,arguments: model); } }