From 84f2458c51ec704fb946efb65b5b3bb2cba02b1b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 23 Apr 2020 19:45:30 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=94=B6=E8=97=8F=E5=A4=B9?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 651264 -> 651264 bytes lib/app/router.dart | 6 +- lib/blocs/category/category_bloc.dart | 70 ++++---- lib/blocs/category/category_event.dart | 14 ++ .../permanent/input_button.dart} | 24 ++- .../impl/catagory_db_repository.dart | 24 ++- lib/repositories/itf/category_repository.dart | 1 + lib/storage/dao/category_dao.dart | 21 +++ lib/storage/dao/widget_dao.dart | 1 - lib/views/items/category_list_item.dart | 9 +- .../{collect => category}/category_show.dart | 159 +++++++++--------- .../{collect => category}/collect_page.dart | 3 +- .../pages/category/edit_category_panel.dart | 100 +++++++++++ .../home_right_drawer.dart | 96 ++++++----- .../pages/detail/category_end_drawer.dart | 8 +- .../pages/navigation/unit_navigation.dart | 5 +- 16 files changed, 351 insertions(+), 190 deletions(-) rename lib/{views/pages/collect/InputButton.dart => components/permanent/input_button.dart} (87%) rename lib/views/pages/{collect => category}/category_show.dart (50%) rename lib/views/pages/{collect => category}/collect_page.dart (98%) create mode 100644 lib/views/pages/category/edit_category_panel.dart rename lib/views/pages/{collect => category}/home_right_drawer.dart (56%) diff --git a/assets/flutter.db b/assets/flutter.db index f72fcea793beb045a4ef7787f06aa0e2d4f5b425..b9bb5c7876915606b540a1578a02f461f375b88f 100644 GIT binary patch delta 4202 zcmZ|Qd2kd}9>DSL&h+oscZX9sGy*{m3Cul70AolPK;#k-gUTTw$f2O3+>>7e0XY_M zKm`N>h_b?}fFcq>MFrh*)hcV1-LkCgN(i`BmgQQzZn@WczqW+hjqpc4^9kiu$l{)Cil*N

yG_#a-YJEpDO-X@2CgvSZ9abY{#rM=2vFgsKrl@ zwYuRLcBkHsr4$uWWo4z|Htjrp@yRupch+^wX0vhmKOD)Ae{4+6SG7Sr8jqGllO^%Q zxLCS86)TTM`zE5%bSCplGi6aq*u245-r&T_rX#iC2Fa?*Y$|&3nZx;xi{=dddA)dP zSv;0%X+1d;Pf%~`$_ZaMx&A`K@o>F(tSp^Pg4eszljOJB?aWk-fO@Pbkhq-5 zE#uY&;(v%lV z@(ULiGo?xDRlr+U$gMA&Xt=!Z>2T|^s(5BlG_S3ge$`^JWIWmOb%>c%oUYe+v0ieq zOM5pqZ`~6vRvoL3mS*#3R@7WsESAiqQZ3$PIg?IOZPw%hZ*WRDJ^WG=kIq$T0+xU<~J?gV#~JH)MUGj2b(hg;-c(G-cA>%qtn{49M%58{?@)^ zH`<@uxsU9#_9^=n`;fiQ-fnNQSKCYN1@=t)9($~Pt9^@|woB}8b_d(Hb?Zm#JL|I5 zXnk&dWW8s-VI8wxu=ZL{TbrypYq|A^HOIQwsv`x+Uhw-h^ zY~8zn}u(aC6KApRS_$FH#w zKf@3448D#pFQ3^DMkpUXbhyjgalmLxn^Z^>d=nZrm zqh}6iI7{5YTLr`^zmGI5)JsT1L%o1BB-D1KY^Y5@gN0NpjZ_^DtwyQ}wF+nuPu>7j z$tVK4g>gMnMR-tNykPTPaDY;b zEE{p|0H!vOqDq`FNbUov4 zAWoHe7m!SqYEA^=Qkmjar81`jajDGZNNxH04doRi z*(%Kt86p`gp*N6Zt%P1jlDQIk4M^rnHTolQtqetcX}DH~vK~m*N;O0yWUR#T;#HTm z5)zG&xe_{nBzq3r7Stu3C zVRj@ZkwnfDh+1%+Ksk#tPU5rAfNYZrw}32@3Il<=1OtGx1Z60zBo2HZr-s;$vPxoP z6HMlhOb3n*&18QB-bL9Tf!tdt`y=!wa({HC0XaXq zatdU9RDBr8_Ne+0s~kE%yOW=GZg0Y^vgi$e$P&P(PY(m)>fdIHMkrmiA9H_%CAy%R+j5vg_NWOnUwZMsq z z$hxT7Y~;3R%8STp(Uja%SQvh0Gs?1v4{ron7FFwy+!alE2W3{o%o*gYXv$XPs%Xk; zXvz-cplIUh$eyU$9Ed~|Q&Zjp5fkzEc@S6b2y6kB2aX5zb@ggp by;fIWP*)$RtJmx5p{^e5>W$~>&C&k_{hs(0 delta 4273 zcmZ{mYj9LW7RPTVGw0mf_XWsHKmr2tkjK0-nTcWu1OyQU0TD$53W|UrqVi_a7mS1j z0uBNynn48tk*6XWKz5g1@q@LpA1q6^R;nN*RJlGrxIW6Vw$HgL)>h=p{5Yql``+&U z|0Xr(`_`QAyQ!;KySdv4vG(xvrPX5C(NC)fw&^m!@TkMGNWzj(s!P4(-Vo;udDb3^l%hUU7x7ixk; zED;+NOASgSC&kj`$wYZ9F*qHMl_qt))lRxBrYh`TrmtJl&1%_JfBA*lizlAXzr18_ z;IownX-6N zjj(v8MU|DN+q7;^^Oi>aK)ptd8kI^Vlj*S1RDbYdcWJKY2{k;b)sS9{TFU z`sTWKnog-p+YgraXgRp6xpB?K#$%Uu>~DGZ^}M$%JM0fOsI)8-FUz+2Ze^K7CZ*CQ zKhf0urez)T`A9) z-TJ$xl4Y@kN=L(Y4R^nxW%bE$_hYf)BdSvQcUCOye`T^{BAZUP`Yy?2ER)JlT)FOd z?-I}Iqi=O|Je$oX)X-vH`k}nPs$+Y7e!tzJ@L0=xRPN_r@ z&o_ZyB@9XUDpm2SSY}kK3!Gaub;@rGq++pjvegBslgg^B;03CAuTHJK{QRk=wRBTs z{O|JX+b_L+IJ^n^Zss4$&El<#mzTx|r?UDU{C^65?WE(WBQ?=Bx#&+t{`daZev5zJ z|HS{uKkJ|NkNb!GJ$}J|&VRY^l<~a8|Q=Re7XlIy{ zabiwir@Pa^ahziNNBbMQ#m;?he{6qfpRpV5BlcdqU~jWG*sJZO_5ypBeUClCzS$mX zC++@riQU1rZ6Uvt|B)BvXY!x&19@7$Ef2_Da)->zbyCSCa)EqM-YX}`v2wV~%9!jc zyUPyJk;T@J);Cs*^||%2^`UjfYP1epuURiz`J7c}<*d2Z6V?oCiZ#v}VP&nZ))1?Y z)y}dk!~D+t(rhw6GtZgtnoXI7czX3V_K>}Iwz zP5c?Z)ndPZpW-<@i|^qvd;?#_7w{RZ!x~(S^KlkV!-+TsE3mQ@ug9L)30*9PAK)u! zg3sU_ybmYgDC~s>*a{n98LWYYFdM32GK_^vD1$-J3w($|m*`LW_v78-90bE6hE-(z z4TGB^hA1jB-ooGpqGB=DfS^L7u;*it4QpdC$b>WsgR+oDVvr803WHK2(|8ku6j9W8 z6N02BVLt*vf}lu4oM9g1f+4*8YkH{|kD3R;K!!OGT+gHCU@$;~p6Uz+{fU669}ya- zG3Xn1HC-3ddl>WysS$%~iEQIt40;loL?vPOB<6zdVf!5nt_kS`2HnDenz|B!aU6p# zA)UhD>aeT7(J8FGjX}q-rl|vwZR~`gy(Zzzg5W9wdn^R)2&~Z%v?V|dIiGuzAn>?1 z6#|DVcS2w@+yQ}Pm;iyrFdhPv;dTg+VH^ZNfMXzt5=1pb7;c83m|LSDC}OCBKroDe zz{oKTM@3L1MPF2_h@wO*L+XucMcCD}oX8d>sFo3-=!j}bNF6{e)+FpHpq^xy23B&aGrfB6Kc5mYiY3@5NPRPvxjptK(5W zo2Fhw4iW1DjK8DmK{ZKK64Fsr>(jBw}xvMC^^IaR?QALlWg! z9ANA~#p000R#YSoefk?wkvTN22NkO0aZs!d`7o$9x+mmpP^=L75Ga=_Fbou%Lk;rcX$aX5NEt%*MHU7aXOVp&jkBEC=$1fSEZU zT?lI?kSv7$jU-hFNJA)!G_WU}>u`pyYXfXSl7oh)u$n+>U?oUn4gO+;HORV%7y;Z( zvqgIY8A8Y&Kz1`^Pk1 zK}xqipjVL6t>I;)bnDj3Na@xm^-R>$U}2O(ZrR}I4`Dw59CiDC;H29#fP-#N2hO=& z4IFd(KH!i$Y2b`Ir4XU-J7#C#h&u?Ja0h?`?i2-u+JdMp6x9}rYYUOuLbSF3wFRs# Kn7a$s`2PW}oj@%B diff --git a/lib/app/router.dart b/lib/app/router.dart index abbbb72..281b765 100644 --- a/lib/app/router.dart +++ b/lib/app/router.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_unit/views/pages/about/about_me_page.dart'; import 'package:flutter_unit/views/pages/about/about_app_page.dart'; -import 'package:flutter_unit/views/pages/collect/category_show.dart'; -import 'package:flutter_unit/views/pages/collect/collect_page.dart'; +import 'package:flutter_unit/views/pages/category/category_show.dart'; +import 'package:flutter_unit/views/pages/category/collect_page.dart'; import 'package:flutter_unit/views/pages/search/serach_page.dart'; import 'package:flutter_unit/views/pages/setting/code_style_setting.dart'; import 'package:flutter_unit/views/pages/setting/font_setting.dart'; @@ -10,7 +10,7 @@ import 'package:flutter_unit/views/pages/setting/item_style_setting.dart'; import 'package:flutter_unit/views/pages/setting/theme_color_setting.dart'; import 'package:flutter_unit/views/pages/unit_todo/attr_unit_page.dart'; import 'package:flutter_unit/views/pages/unit_todo/bug_unit_page.dart'; -import 'package:flutter_unit/views/pages/collect/category_page.dart'; +import 'package:flutter_unit/views/pages/category/category_page.dart'; import 'package:flutter_unit/views/pages/detail/widget_detail_page.dart'; import 'package:flutter_unit/views/pages/unit_todo/layout_unit_page.dart'; import 'package:flutter_unit/views/pages/unit_todo/paint_unit_page.dart'; diff --git a/lib/blocs/category/category_bloc.dart b/lib/blocs/category/category_bloc.dart index bf342bf..d1bcc70 100644 --- a/lib/blocs/category/category_bloc.dart +++ b/lib/blocs/category/category_bloc.dart @@ -1,6 +1,7 @@ - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/app/style/unit_color.dart'; +import 'package:flutter_unit/app/utils/color_utils.dart'; import 'package:flutter_unit/repositories/itf/category_repository.dart'; import 'package:flutter_unit/storage/po/category_po.dart'; @@ -9,13 +10,13 @@ import 'category_state.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: class CategoryBloc extends Bloc { final CategoryRepository repository; - CategoryBloc({@required this.repository}){ - print('CategoryBloc') ; + CategoryBloc({@required this.repository}) { + print('CategoryBloc'); } @override @@ -23,20 +24,11 @@ class CategoryBloc extends Bloc { @override Stream mapEventToState(CategoryEvent event) async* { - print('CategoryBloc'); -// if (event is ToggleCategoryEvent) { -// await repository.toggleCategory(event.id); -// var collected= await repository.checkCategoryed(1, event.id); -// yield ToggleCategorySuccess(collected); -// } -// if (event is CheckCategoryEvent) { -// var collected = await repository.checkCategoryed(1, event.id); -// yield CheckCategorySuccess(collected); -// } - if (event is EventLoadCategory) { final category = await repository.loadCategories(); - yield category.isEmpty?CategoryEmptyState():CategoryLoadedState(category); + yield category.isEmpty + ? CategoryEmptyState() + : CategoryLoadedState(category); } if (event is EventDeleteCategory) { @@ -44,14 +36,15 @@ class CategoryBloc extends Bloc { add(EventLoadCategory()); } if (event is EventToggleWidget) { - await repository.toggleCategory(event.categoryId,event.widgetId); + await repository.toggleCategory(event.categoryId, event.widgetId); add(EventLoadCategory()); } if (event is EventAddCategory) { var categoryPo = CategoryPo( name: event.name, - color: event.color ?? '#FF2196F3', + color: event.color ?? + ColorUtils.colorString(UnitColor.collectColorSupport[0]), info: event.info ?? '这里什么都没有...', created: DateTime.now(), updated: DateTime.now()); @@ -61,32 +54,29 @@ class CategoryBloc extends Bloc { if (success) { yield AddCategorySuccess(); add(EventLoadCategory()); - }else{ + } else { yield AddCategoryFailed(); } } + if (event is EventUpdateCategory) { + var categoryPo = CategoryPo( + id: event.id, + name: event.name, + priority: event.priority ?? 0, + image: event.image ?? '', + color: event.color ?? ColorUtils.colorString(UnitColor.collectColorSupport[0]), + info: event.info ?? '这里什么都没有...', + updated: DateTime.now()); -// if (event is EventAddCategory) { -// var collectPo = CategoryPo( -// name: event.name, -// color: event.color ?? '#FF2196F3', -// info: event.info ?? '这里什么都没有...', -// created: DateTime.now(), -// updated: DateTime.now()); -// -// final success = await repository.addCategory(collectPo); -// -// if (success) { + final success = await repository.updateCategory(categoryPo); + + if (success) { // yield AddCategorySuccess(); -// final collect = await repository.loadCategorys(); -// yield LoadCategorySuccess(collects: collect); -// } -// } -// if (event is EventDeleteCategory) { -// await repository.deleteCategory(event.id); -// final collect = await repository.loadCategorys(); -// yield LoadCategorySuccess(collects: collect); -// } + add(EventLoadCategory()); + } else { +// yield AddCategoryFailed(); + } + } } -} \ No newline at end of file +} diff --git a/lib/blocs/category/category_event.dart b/lib/blocs/category/category_event.dart index f8c1043..d869a0c 100644 --- a/lib/blocs/category/category_event.dart +++ b/lib/blocs/category/category_event.dart @@ -44,3 +44,17 @@ class EventAddCategory extends CategoryEvent{ @override List get props => [name,info,color]; } + +class EventUpdateCategory extends CategoryEvent { + final int id; + final String name; + final String info; + final String color; + final int priority; + final String image; + + EventUpdateCategory({@required this.name, this.info, this.color,this.priority,this.image,this.id}); + + @override + List get props => [name, info, color,priority,image,id]; +} diff --git a/lib/views/pages/collect/InputButton.dart b/lib/components/permanent/input_button.dart similarity index 87% rename from lib/views/pages/collect/InputButton.dart rename to lib/components/permanent/input_button.dart index 1b0036f..81f6b51 100644 --- a/lib/views/pages/collect/InputButton.dart +++ b/lib/components/permanent/input_button.dart @@ -10,8 +10,10 @@ class InputButtonConfig { final Widget front; //前面图标 final bool submitClear; //是否提交清空 + const InputButtonConfig( {this.height = 36, + this.iconData = Icons.add, this.fontSize = 14, this.submitClear = true, @@ -24,11 +26,13 @@ class InputButton extends StatefulWidget { final ValueChanged onChanged; final VoidCallback onTap; final InputButtonConfig config; + final String defaultText; InputButton( {Key key, this.onSubmit, this.onChanged, + this.defaultText, this.onTap, this.config = const InputButtonConfig()}) : super(key: key); @@ -38,24 +42,31 @@ class InputButton extends StatefulWidget { } class _InputButtonState extends State { - var _text = ""; var _height; var _fontSize; var _radius; + TextEditingController _controller; + @override void initState() { + super.initState(); _height = widget.config.height; _fontSize = widget.config.fontSize; _radius = Radius.circular(_height / 3.6); + _controller = TextEditingController(text: widget.defaultText??''); + } - super.initState(); + @override + void dispose() { + _controller.dispose(); + super.dispose(); } @override Widget build(BuildContext context) { var textField = TextField( - controller: TextEditingController(text: _text), + controller: _controller, maxLines: 1, style: TextStyle( fontSize: _fontSize, @@ -79,8 +90,7 @@ class _InputButtonState extends State { ), ), onChanged: (str) { - _text = str; - if (widget.onChanged != null) widget.onChanged(_text); + if (widget.onChanged != null) widget.onChanged(str); }, onTap: widget.onTap, ); @@ -92,10 +102,10 @@ class _InputButtonState extends State { padding: EdgeInsets.zero, onPressed: () { FocusScope.of(context).requestFocus(FocusNode()); //收起键盘 - if (widget.onSubmit != null) widget.onSubmit(_text); + if (widget.onSubmit != null) widget.onSubmit(_controller.text); if (widget.config.submitClear) { setState(() { - _text = ""; + _controller.clear(); }); } }, diff --git a/lib/repositories/impl/catagory_db_repository.dart b/lib/repositories/impl/catagory_db_repository.dart index 215e6db..14114f5 100644 --- a/lib/repositories/impl/catagory_db_repository.dart +++ b/lib/repositories/impl/catagory_db_repository.dart @@ -13,50 +13,56 @@ import 'package:flutter_unit/storage/po/widget_po.dart'; class CategoryDbRepository implements CategoryRepository { final AppStorage storage; - CategoryDao _collectDao; + CategoryDao _categoryDao; CategoryDbRepository(this.storage) { - _collectDao = CategoryDao(storage); + _categoryDao = CategoryDao(storage); } @override Future addCategory(CategoryPo categoryPo) async { - var success = await _collectDao.insert(categoryPo); + var success = await _categoryDao.insert(categoryPo); return success != -1; } @override Future check(int categoryId, int widgetId) async { - return await _collectDao.existWidgetInCollect(categoryId, widgetId); + return await _categoryDao.existWidgetInCollect(categoryId, widgetId); } @override Future deleteCategory(int id) async { - await _collectDao.deleteCollect(id); + await _categoryDao.deleteCollect(id); } @override Future> loadCategories() async { - var data = await _collectDao.queryAll(); + var data = await _categoryDao.queryAll(); var collects = data.map((e) => CategoryPo.fromJson(e)).toList(); return collects.map(CategoryModel.fromPo).toList(); } @override Future> loadCategoryWidgets({int categoryId = 0}) async { - var rawData = await _collectDao.loadCollectWidgets(categoryId); + var rawData = await _categoryDao.loadCollectWidgets(categoryId); var widgets = rawData.map((e) => WidgetPo.fromJson(e)).toList(); return widgets.map(WidgetModel.fromPo).toList(); } @override Future toggleCategory(int categoryId, int widgetId) async { - return await _collectDao.toggleCollect( categoryId, widgetId); + return await _categoryDao.toggleCollect( categoryId, widgetId); } @override Future> getCategoryByWidget(int widgetId) async { - return await _collectDao.categoryWidgetIds(widgetId); + return await _categoryDao.categoryWidgetIds(widgetId); + } + + @override + Future updateCategory(CategoryPo categoryPo) async{ + var success = await _categoryDao.update(categoryPo); + return success != -1; } // diff --git a/lib/repositories/itf/category_repository.dart b/lib/repositories/itf/category_repository.dart index 24c701d..72dd8f4 100644 --- a/lib/repositories/itf/category_repository.dart +++ b/lib/repositories/itf/category_repository.dart @@ -18,6 +18,7 @@ abstract class CategoryRepository { Future> loadCategories(); Future addCategory(CategoryPo categoryPo); + Future updateCategory(CategoryPo categoryPo); Future deleteCategory(int id); Future> getCategoryByWidget(int widgetId); diff --git a/lib/storage/dao/category_dao.dart b/lib/storage/dao/category_dao.dart index 161c880..2900616 100644 --- a/lib/storage/dao/category_dao.dart +++ b/lib/storage/dao/category_dao.dart @@ -44,6 +44,27 @@ class CategoryDao { ])); } + Future update(CategoryPo widget) async { + //插入方法 + final db = await _db; + String updateSql = //插入数据 + "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " + "WHERE id = ?"; + + return await db.transaction((tran) async => + await tran.rawUpdate(updateSql, [ + widget.name, + widget.color, + widget.info, + widget.priority, + widget.image, + widget.updated.toIso8601String(), + widget.id, + ])); + } + + + Future addWidget(int categoryId,int widgetId,) async { final db = await _db; String addSql = //插入数据 diff --git a/lib/storage/dao/widget_dao.dart b/lib/storage/dao/widget_dao.dart index 080998b..d598b00 100644 --- a/lib/storage/dao/widget_dao.dart +++ b/lib/storage/dao/widget_dao.dart @@ -66,7 +66,6 @@ class WidgetDao { final db = await storage.db; var data = await db.rawQuery('SELECT collected FROM widget WHERE id = ?', [id]); var collected = data.toList()[0]['collected']==1; - print('collected:$collected'); return await db.rawQuery( "UPDATE widget SET collected = ? " "WHERE id = ?", diff --git a/lib/views/items/category_list_item.dart b/lib/views/items/category_list_item.dart index 1da4a53..c69c780 100644 --- a/lib/views/items/category_list_item.dart +++ b/lib/views/items/category_list_item.dart @@ -11,8 +11,9 @@ import 'package:flutter_unit/model/category_model.dart'; class CategoryListItem extends StatelessWidget { final CategoryModel data; final Function(CategoryModel) onDeleteItemClick; + final Function(CategoryModel) onEditItemClick; - CategoryListItem({this.data, this.onDeleteItemClick}); + CategoryListItem({this.data, this.onDeleteItemClick,this.onEditItemClick}); @override Widget build(BuildContext context) { @@ -57,7 +58,11 @@ class CategoryListItem extends StatelessWidget { right: 5, child: FeedbackWidget( - onPressed: () {}, + onPressed: () { + if (onEditItemClick != null) { + onEditItemClick(data); + } + }, child: Icon( Icons.edit, size: 20, diff --git a/lib/views/pages/collect/category_show.dart b/lib/views/pages/category/category_show.dart similarity index 50% rename from lib/views/pages/collect/category_show.dart rename to lib/views/pages/category/category_show.dart index 950508a..4072c3c 100644 --- a/lib/views/pages/collect/category_show.dart +++ b/lib/views/pages/category/category_show.dart @@ -27,35 +27,42 @@ class CategoryShow extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text(model.name)), - body: BlocBuilder(builder: (_, state) { - if (state is CategoryWidgetLoadedState) { - return _buildWidgetList(state.widgets); - } - return Container(); - }), + appBar: AppBar(title: Text(model.name)), + body: BlocBuilder( + builder: (_, state) { + if (state is CategoryWidgetLoadedState) { + return _buildWidgetList(state.widgets); + } + return Container(); + }), ); } Widget _buildWidgetList(List widgets) { return ListView.separated( - separatorBuilder: (_, index) => Divider(height: 1,), + separatorBuilder: (_, index) => Divider( + height: 1, + ), itemBuilder: (context, index) => Dismissible( - direction: DismissDirection.endToStart, - key: ValueKey(widgets[index].id), - background: Container( - padding: EdgeInsets.only(right: 20), - alignment: Alignment.centerRight, - color: Colors.red, - child: Icon(CupertinoIcons.delete_solid,color: Colors.white,size: 30,), - ), - onDismissed: (v){ - BlocProvider.of(context) - .add(EventToggleCategoryWidget(model.id,widgets[index].id)); - }, - child: Container( - margin: EdgeInsets.symmetric(horizontal: 15, vertical: 8), - child: FeedbackWidget( + direction: DismissDirection.endToStart, + key: ValueKey(widgets[index].id), + background: Container( + padding: EdgeInsets.only(right: 20), + alignment: Alignment.centerRight, + color: Colors.red, + child: Icon( + CupertinoIcons.delete_solid, + color: Colors.white, + size: 30, + ), + ), + onDismissed: (v) { + BlocProvider.of(context).add( + EventToggleCategoryWidget(model.id, widgets[index].id)); + }, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 15, vertical: 8), + child: FeedbackWidget( duration: Duration(milliseconds: 200), onPressed: () => _toDetailPage(context, widgets[index]), child: SimpleWidgetItem( @@ -79,38 +86,38 @@ class SimpleWidgetItem extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Container( color: Colors.transparent, height: 75, child: Row( - children: [ - SizedBox(width: 10,), - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _buildLeading(), - - StarScore( - star: Star(emptyColor: Colors.white, size: 12, fillColor: data.color), - score: data.lever, - ), - ], - ), - SizedBox(width: 20,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _buildTitle(), - _buildSummary() - ], + children: [ + SizedBox( + width: 10, + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildLeading(), + StarScore( + star: Star( + emptyColor: Colors.white, size: 12, fillColor: data.color), + score: data.lever, ), - ) - ], + ], + ), + SizedBox( + width: 20, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [_buildTitle(), _buildSummary()], + ), + ) + ], ), ); - } Widget _buildTitle() { @@ -123,36 +130,36 @@ class SimpleWidgetItem extends StatelessWidget { } Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: Hero( - tag: "hero_widget_image_${data.id}", - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 50, - color: data.color, + padding: const EdgeInsets.only(left: 5, right: 5), + child: Hero( + tag: "hero_widget_image_${data.id}", + child: data.image == null + ? Material( + color: Colors.transparent, + child: CircleText( + text: data.name, + size: 50, + color: data.color, + ), + ) + : CircleImage( + image: data.image, + size: 50, + ), ), - ) - : CircleImage( - image: data.image, - size: 50, - ), - ), - ); + ); Widget _buildSummary() { - return Container( - child: Text( - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Colors.grey[600], - fontSize: 14, - shadows: [Shadow(color: Colors.white, offset: Offset(.5, .5))]), - ), + return Container( + child: Text( + data.info, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: Colors.grey[600], + fontSize: 14, + shadows: [Shadow(color: Colors.white, offset: Offset(.5, .5))]), + ), ); } } diff --git a/lib/views/pages/collect/collect_page.dart b/lib/views/pages/category/collect_page.dart similarity index 98% rename from lib/views/pages/collect/collect_page.dart rename to lib/views/pages/category/collect_page.dart index 0bd8860..480ab01 100644 --- a/lib/views/pages/collect/collect_page.dart +++ b/lib/views/pages/category/collect_page.dart @@ -29,8 +29,7 @@ class CollectPage extends StatelessWidget { Widget build(BuildContext context) { var _topContext = context; return Scaffold( - backgroundColor: - BlocProvider.of(context).state.homeColor.withAlpha(11), + backgroundColor: BlocProvider.of(context).state.homeColor.withAlpha(11), body: DefaultTabController( length: _tabs.length, // This is the number of tabs. child: NestedScrollView( diff --git a/lib/views/pages/category/edit_category_panel.dart b/lib/views/pages/category/edit_category_panel.dart new file mode 100644 index 0000000..35812d3 --- /dev/null +++ b/lib/views/pages/category/edit_category_panel.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/app/style/unit_color.dart'; +import 'package:flutter_unit/app/utils/color_utils.dart'; +import 'package:flutter_unit/blocs/category/category_bloc.dart'; +import 'package:flutter_unit/blocs/category/category_event.dart'; +import 'package:flutter_unit/components/permanent/edit_panel.dart'; +import 'package:flutter_unit/components/permanent/input_button.dart'; +import 'package:flutter_unit/components/project/color_chooser.dart'; +import 'package:flutter_unit/model/category_model.dart'; + +/// create by 张风捷特烈 on 2020-04-23 +/// contact me by email 1981462002@qq.com +/// 说明: + +enum EditType { add, update } + +class EditCategoryPanel extends StatefulWidget { + final CategoryModel model; + final EditType type; + + EditCategoryPanel({this.model, this.type = EditType.add}); + + @override + _EditCategoryPanelState createState() => _EditCategoryPanelState(); +} + +class _EditCategoryPanelState extends State { + String name; + String color; + String info; + + int get colorIndex => widget.model == null + ? 0 + : UnitColor.collectColorSupport + .map((e) => e.value) + .toList() + .indexOf(widget.model.color.value); + + @override + void initState() { + super.initState(); + info = widget.model?.info; + color = widget.model == null + ? null + : ColorUtils.colorString(widget.model.color); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + child: InputButton( + defaultText: widget.model?.name, + config: InputButtonConfig(hint: '收藏集名称', iconData: Icons.check), + onSubmit: (str) { + name = str; + if (name.isNotEmpty) { + if (widget.type == EditType.add) { + BlocProvider.of(context).add( + EventAddCategory(name: name, info: info, color: color)); + } + if (widget.type == EditType.update) { + BlocProvider.of(context).add( + EventUpdateCategory( + id: widget.model.id, + name: name, + info: info, + color: color)); + } + } + Navigator.of(context).pop(); + }, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + child: EditPanel( + defaultText: widget.model?.info, + submitClear: false, + hint: '收藏集简介...', + onChange: (v) => info = v, + ), + ), + Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15), + child: ColorChooser( + defaultIndex: colorIndex, + colors: UnitColor.collectColorSupport, + onChecked: (v) => color = ColorUtils.colorString(v), + ), + ), + ], + ); + } +} diff --git a/lib/views/pages/collect/home_right_drawer.dart b/lib/views/pages/category/home_right_drawer.dart similarity index 56% rename from lib/views/pages/collect/home_right_drawer.dart rename to lib/views/pages/category/home_right_drawer.dart index e7311db..8c94125 100644 --- a/lib/views/pages/collect/home_right_drawer.dart +++ b/lib/views/pages/category/home_right_drawer.dart @@ -1,18 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/style/unit_color.dart'; -import 'package:flutter_unit/app/style/unit_text_style.dart'; -import 'package:flutter_unit/app/utils/Toast.dart'; import 'package:flutter_unit/app/utils/color_utils.dart'; import 'package:flutter_unit/blocs/category/category_bloc.dart'; import 'package:flutter_unit/blocs/category/category_event.dart'; -import 'package:flutter_unit/blocs/collect/collect_bloc.dart'; -import 'package:flutter_unit/blocs/collect/collect_event.dart'; import 'package:flutter_unit/components/permanent/circle.dart'; import 'package:flutter_unit/components/project/color_chooser.dart'; import 'package:flutter_unit/views/common/unit_drawer_header.dart'; -import 'package:flutter_unit/views/pages/collect/InputButton.dart'; -import 'package:flutter_unit/views/pages/collect/edit_panel.dart'; +import 'package:flutter_unit/components/permanent/input_button.dart'; +import 'package:flutter_unit/components/permanent/edit_panel.dart'; + +import 'edit_category_panel.dart'; class HomeRightDrawer extends StatefulWidget { final Color color; @@ -41,40 +39,7 @@ class _HomeRightDrawerState extends State { child: ListView(padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color:widget.color), _buildTitle(context), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), - child: InputButton( - config: InputButtonConfig(hint: '收藏集名称', iconData: Icons.check), - onSubmit: (str) { - name = str; - if(name.isNotEmpty){ - BlocProvider.of(context) - .add(EventAddCategory(name: name, info: info, color: color)); - } - - Navigator.of(context).pop(); -// Toast.toast(context, '收藏集功能正在开发中...', -// duration: Duration(seconds: 1)); - }, - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), - child: EditPanel( - submitClear: false, - hint: '收藏集简介...', - onChange: (v) => info = v, - ), - ), - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15), - child: ColorChooser( - defaultIndex: 0, - colors: UnitColor.collectColorSupport, - onChecked: (v) => color = ColorUtils.colorString(v), - ), - ), + EditCategoryPanel() ]), ); @@ -108,3 +73,54 @@ class _HomeRightDrawerState extends State { ); } } + +//class EditCategoryPanel extends StatefulWidget { +// @override +// _EditCategoryPanelState createState() => _EditCategoryPanelState(); +//} +// +//class _EditCategoryPanelState extends State { +// String name; +// String color; +// String info; +// +// @override +// Widget build(BuildContext context) { +// return Column( +// children: [ +// Padding( +// padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), +// child: InputButton( +// config: InputButtonConfig(hint: '收藏集名称', iconData: Icons.check), +// onSubmit: (str) { +// name = str; +// if(name.isNotEmpty){ +// BlocProvider.of(context) +// .add(EventAddCategory(name: name, info: info, color: color)); +// } +// Navigator.of(context).pop(); +// }, +// ), +// ), +// Padding( +// padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), +// child: EditPanel( +// submitClear: false, +// hint: '收藏集简介...', +// onChange: (v) => info = v, +// ), +// ), +// Container( +// alignment: Alignment.center, +// padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15), +// child: ColorChooser( +// defaultIndex: 0, +// colors: UnitColor.collectColorSupport, +// onChecked: (v) => color = ColorUtils.colorString(v), +// ), +// ), +// ], +// ); +// } +//} + diff --git a/lib/views/pages/detail/category_end_drawer.dart b/lib/views/pages/detail/category_end_drawer.dart index 4112f6b..9a3fc38 100644 --- a/lib/views/pages/detail/category_end_drawer.dart +++ b/lib/views/pages/detail/category_end_drawer.dart @@ -1,22 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/style/unit_color.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; import 'package:flutter_unit/blocs/category/category_bloc.dart'; -import 'package:flutter_unit/blocs/category/category_event.dart'; import 'package:flutter_unit/blocs/category/category_state.dart'; import 'package:flutter_unit/blocs/category_widget/category_widget_bloc.dart'; import 'package:flutter_unit/blocs/category_widget/category_widget_event.dart'; import 'package:flutter_unit/components/permanent/circle.dart'; -import 'package:flutter_unit/components/permanent/feedback_widget.dart'; import 'package:flutter_unit/components/permanent/panel.dart'; -import 'package:flutter_unit/components/project/color_chooser.dart'; import 'package:flutter_unit/model/category_model.dart'; import 'package:flutter_unit/model/widget_model.dart'; import 'package:flutter_unit/repositories/itf/category_repository.dart'; import 'package:flutter_unit/views/common/unit_drawer_header.dart'; -import 'package:flutter_unit/views/pages/collect/InputButton.dart'; -import 'package:flutter_unit/views/pages/collect/edit_panel.dart'; + /// create by 张风捷特烈 on 2020-04-22 /// contact me by email 1981462002@qq.com diff --git a/lib/views/pages/navigation/unit_navigation.dart b/lib/views/pages/navigation/unit_navigation.dart index f298fc1..3b9ab92 100644 --- a/lib/views/pages/navigation/unit_navigation.dart +++ b/lib/views/pages/navigation/unit_navigation.dart @@ -6,10 +6,9 @@ import 'package:flutter_unit/blocs/collect/collect_bloc.dart'; import 'package:flutter_unit/blocs/collect/collect_event.dart'; import 'package:flutter_unit/blocs/widgets/home_bloc.dart'; import 'package:flutter_unit/blocs/widgets/home_state.dart'; -import 'package:flutter_unit/views/pages/collect/collect_page.dart'; -import 'package:flutter_unit/views/pages/collect/home_right_drawer.dart'; +import 'package:flutter_unit/views/pages/category/collect_page.dart'; +import 'package:flutter_unit/views/pages/category/home_right_drawer.dart'; import 'package:flutter_unit/views/pages/navigation/unit_bottom_bar.dart'; -import '../collect/category_page.dart'; import '../home/home_page.dart'; import '../home/home_drawer.dart';