From 8b45252b9f4af08e320d227f77163c7b0a882253 Mon Sep 17 00:00:00 2001 From: LXD312569496 <450468291@qq.com> Date: Tue, 15 Oct 2019 22:01:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/model/date_model.dart | 11 +++ lib/widget/month_view.dart | 112 ++++++++++++++++++------------- lib/widget/month_view_pager.dart | 7 +- lib/widget/week_view_pager.dart | 6 +- 4 files changed, 88 insertions(+), 48 deletions(-) diff --git a/lib/model/date_model.dart b/lib/model/date_model.dart index 4061ea2..0882e3b 100644 --- a/lib/model/date_model.dart +++ b/lib/model/date_model.dart @@ -124,3 +124,14 @@ class DateModel { return this.getDateTime().isBefore(dateModel.getDateTime()); } } + +class X { + var _y; + + get y => null == _y ? initY() : _y; + + initY() { + //do some computation + _y = "result"; + } +} diff --git a/lib/widget/month_view.dart b/lib/widget/month_view.dart index 1d0c85c..27d783b 100644 --- a/lib/widget/month_view.dart +++ b/lib/widget/month_view.dart @@ -22,11 +22,12 @@ class MonthView extends StatefulWidget { final CalendarConfiguration configuration; const MonthView({ + Key key, @required this.year, @required this.month, this.day, this.configuration, - }); + }) : super(key: key); @override _MonthViewState createState() => _MonthViewState(); @@ -34,13 +35,13 @@ class MonthView extends StatefulWidget { class _MonthViewState extends State with AutomaticKeepAliveClientMixin { - List items; + List items = List(); int lineCount; - double itemHeight; - double totalHeight; - double mainSpacing = 10; +// double itemHeight; +// double totalHeight; +// double mainSpacing = 10; DateModel minSelectDate; DateModel maxSelectDate; @@ -68,38 +69,48 @@ class _MonthViewState extends State items = CacheData.getInstance().monthListCache[firstDayOfMonth]; } else { LogUtil.log(TAG: this.runtimeType, message: "缓存中无数据"); - items = DateUtil.initCalendarForMonthView( - widget.year, widget.month, DateTime.now(), DateTime.sunday, - minSelectDate: minSelectDate, - maxSelectDate: maxSelectDate, - extraDataMap: extraDataMap); + getItems(); CacheData.getInstance().monthListCache[firstDayOfMonth] = items; } lineCount = DateUtil.getMonthViewLineCount(widget.year, widget.month); } + getItems() async { + items = await compute(initCalendarForMonthView, { + 'year': widget.year, + 'month': widget.month, + 'minSelectDate': minSelectDate, + 'maxSelectDate': maxSelectDate, + 'extraDataMap': extraDataMap + }); + setState(() {}); + } + + static Future> initCalendarForMonthView(Map map) async { + return DateUtil.initCalendarForMonthView( + map['year'], map['month'], DateTime.now(), DateTime.sunday, + minSelectDate: map['minSelectDate'], + maxSelectDate: map['maxSelectDate'], + extraDataMap: map['extraDataMap']); + } + @override Widget build(BuildContext context) { super.build(context); LogUtil.log(TAG: this.runtimeType, message: "_MonthViewState build"); - itemHeight = MediaQuery.of(context).size.width / 7; - totalHeight = itemHeight * lineCount + mainSpacing * (lineCount - 1); - return Container(height: totalHeight, child: getView()); - } - - Widget getView() { CalendarProvider calendarProvider = Provider.of(context, listen: false); CalendarConfiguration configuration = calendarProvider.calendarConfiguration; return new GridView.builder( - physics: NeverScrollableScrollPhysics(), - gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount( + addAutomaticKeepAlives: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 7, mainAxisSpacing: 10), - itemCount: 7 * lineCount, + itemCount: items.isEmpty ? 0 : 7 * lineCount, itemBuilder: (context, index) { DateModel dateModel = items[index]; //判断是否被选择 @@ -119,8 +130,6 @@ class _MonthViewState extends State return ItemContainer( dateModel: dateModel, -// configuration: configuration, -// calendarProvider: calendarProvider, ); }); } @@ -135,9 +144,6 @@ class _MonthViewState extends State class ItemContainer extends StatefulWidget { final DateModel dateModel; -// CalendarConfiguration configuration; -// CalendarProvider calendarProvider; - const ItemContainer({ Key key, this.dateModel, @@ -161,9 +167,26 @@ class ItemContainerState extends State { isSelected = ValueNotifier(dateModel.isSelected); } + /** + * 提供方法给外部,可以调用这个方法进行刷新item + */ + void refreshItem() { + /** + Exception caught by gesture + The following assertion was thrown while handling a gesture: + setState() called after dispose() + */ + if (mounted) { + setState(() { + dateModel.isSelected = !dateModel.isSelected; +// isSelected.value = !isSelected.value; + }); + } + } + @override Widget build(BuildContext context) { -// LogUtil.log(TAG: this.runtimeType,message: "ItemContainerState build"); + LogUtil.log(TAG: this.runtimeType, message: "ItemContainerState build"); calendarProvider = Provider.of(context, listen: false); configuration = calendarProvider.calendarConfiguration; @@ -215,29 +238,26 @@ class ItemContainerState extends State { refreshItem(); }, child: configuration.dayWidgetBuilder(dateModel), -// child: ValueListenableBuilder( -// valueListenable: isSelected, -// builder: (BuildContext context, bool value, Widget child) { -// return configuration.dayWidgetBuilder(dateModel); -// }), ); } - /** - * 刷新item - */ - void refreshItem() { - /** - * - Exception caught by gesture - The following assertion was thrown while handling a gesture: - setState() called after dispose() - */ - if (mounted) { - setState(() { - dateModel.isSelected = !dateModel.isSelected; -// isSelected.value = !isSelected.value; - }); - } + @override + void deactivate() { + LogUtil.log( + TAG: this.runtimeType, message: "ItemContainerState deactivate"); + super.deactivate(); + } + + @override + void dispose() { + LogUtil.log(TAG: this.runtimeType, message: "ItemContainerState dispose"); + super.dispose(); + } + + @override + void didUpdateWidget(ItemContainer oldWidget) { + LogUtil.log( + TAG: this.runtimeType, message: "ItemContainerState didUpdateWidget"); + super.didUpdateWidget(oldWidget); } } diff --git a/lib/widget/month_view_pager.dart b/lib/widget/month_view_pager.dart index 4e140bd..1925717 100644 --- a/lib/widget/month_view_pager.dart +++ b/lib/widget/month_view_pager.dart @@ -15,7 +15,7 @@ class MonthViewPager extends StatefulWidget { _MonthViewPagerState createState() => _MonthViewPagerState(); } -class _MonthViewPagerState extends State { +class _MonthViewPagerState extends State with AutomaticKeepAliveClientMixin{ CalendarProvider calendarProvider; @override @@ -57,6 +57,8 @@ class _MonthViewPagerState extends State { @override Widget build(BuildContext context) { + super.build(context); + LogUtil.log(TAG: this.runtimeType, message: "MonthViewPager build"); // 获取到当前的CalendarProvider对象,设置listen为false,不需要刷新 calendarProvider = Provider.of(context, listen: false); CalendarConfiguration configuration = @@ -110,4 +112,7 @@ class _MonthViewPagerState extends State { itemCount: configuration.monthList.length, ); } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/widget/week_view_pager.dart b/lib/widget/week_view_pager.dart index 5858098..0ba52e8 100644 --- a/lib/widget/week_view_pager.dart +++ b/lib/widget/week_view_pager.dart @@ -14,7 +14,7 @@ class WeekViewPager extends StatefulWidget { _WeekViewPagerState createState() => _WeekViewPagerState(); } -class _WeekViewPagerState extends State { +class _WeekViewPagerState extends State with AutomaticKeepAliveClientMixin{ int lastMonth; //保存上一个月份,不然不知道月份发生了变化 CalendarProvider calendarProvider; @@ -37,6 +37,7 @@ class _WeekViewPagerState extends State { @override Widget build(BuildContext context) { + super.build(context); LogUtil.log(TAG: this.runtimeType, message: "WeekViewPager build"); // 获取到当前的CalendarProvider对象,设置listen为false,不需要刷新 @@ -92,4 +93,7 @@ class _WeekViewPagerState extends State { ), ); } + + @override + bool get wantKeepAlive => true; }