diff --git a/README.md b/README.md index 98dd27bf..d7b416c0 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,9 @@ documentation and project management. If you have relevant knowledge and are willing to contribute to this project, you can help me improve the documentation, e.g `README.md` file. +When contribute code to this project, please try to follow +[this][style-guide-for-flutter] guideline. + ## Donate [!["Buy Me A Coffee"][buymeacoffee-badge]](https://www.buymeacoffee.com/d49cb87qgww) @@ -146,3 +149,4 @@ limitations under the License. [eth-addr]: https://etherscan.io/address/0x35FC877Ef0234FbeABc51ad7fC64D9c1bE161f8F [btc-badge]: https://img.shields.io/badge/Bitcoin-000000?style=for-the-badge&logo=bitcoin&logoColor=white [btc-addr]: https://blockchair.com/bitcoin/address/bc1qz2vjews2fcscmvmcm5ctv47mj6236x9p26zk49 +[style-guide-for-flutter]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo diff --git a/analysis_options.yaml b/analysis_options.yaml index b702f6b2..a66f71aa 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -31,9 +31,54 @@ linter: rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - # FIXME: ignore with 3.13.x's linter bug, see https://github.com/dart-lang/linter/issues/4753 + # FIXME: ignore with 3.13.x's linter bug. + # see https://github.com/dart-lang/linter/issues/4753 use_build_context_synchronously: false + # Prefer relative imports for files in lib/. + # see: https://dart.dev/tools/linter-rules/prefer_relative_imports prefer_relative_imports: true + # Private field could be final. + # see: https://dart.dev/tools/linter-rules/prefer_final_fields + prefer_final_fields: true + # Prefer final for variable declarations if they are not reassigned. + # see: https://dart.dev/tools/linter-rules/prefer_final_locals + prefer_final_locals: true + # Don't use the Null type, unless you are positive that you don't want void. + # see: https://dart.dev/tools/linter-rules/prefer_void_to_null + prefer_void_to_null: true + # Test type arguments in operator ==(Object other). + # see: https://dart.dev/tools/linter-rules/test_types_in_equals + test_types_in_equals: true + # Declare method return types. + # see: https://dart.dev/tools/linter-rules/always_declare_return_types + always_declare_return_types: true + # Avoid annotating types for function expression parameters. + # see: https://dart.dev/tools/linter-rules/avoid_types_on_closure_parameters + avoid_types_on_closure_parameters: true + # Sort combinator names alphabetically. + # see: https://dart.dev/tools/linter-rules/combinators_ordering + combinators_ordering: true + # Adhere to Effective Dart Guide directives sorting conventions. + # see: https://dart.dev/tools/linter-rules/directives_ordering + directives_ordering: true + # Put a single newline at end of file. + # see: https://dart.dev/tools/linter-rules/eol_at_end_of_file + eol_at_end_of_file: true + # Missing whitespace between adjacent strings. + # see: https://dart.dev/tools/linter-rules/missing_whitespace_between_adjacent_strings + missing_whitespace_between_adjacent_strings: true + # Don't create a lambda when a tear-off will do. + # see: https://dart.dev/tools/linter-rules/unnecessary_lambdas + unnecessary_lambdas: true + # Use enums rather than classes that behave like enums. + # see: https://dart.dev/tools/linter-rules/use_enums + use_enums: true + # Use string buffers to compose strings. + # see: https://dart.dev/tools/linter-rules/use_string_buffers + use_string_buffers: true + # Start the name of the method with to/_to or as/_as if applicable. + # see: https://dart.dev/tools/linter-rules/use_to_and_as_if_applicable + use_to_and_as_if_applicable: true # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/lib/annotation/contributor_converter.dart b/lib/annotation/contributor_converter.dart index 4b33621b..97711d21 100644 --- a/lib/annotation/contributor_converter.dart +++ b/lib/annotation/contributor_converter.dart @@ -24,9 +24,7 @@ class ContributorCollectionConverter const ContributorCollectionConverter(); Iterable buildDefinedContributors(Iterable rawData) => - rawData - .whereType>() - .map((e) => ContributorInfo.fromJson(e)); + rawData.whereType>().map(ContributorInfo.fromJson); Iterable buildContributors(Iterable rawData, [Map definedContributors = const {}]) sync* { diff --git a/lib/common/math.dart b/lib/common/math.dart index 9aa7c1b0..79e6a8ae 100644 --- a/lib/common/math.dart +++ b/lib/common/math.dart @@ -32,18 +32,18 @@ num intervalTrans( num habitGrowCurve( {int days = 30, num x = 1, Tuple2 interv = _defualtInterv}) { - num x0 = 0; - num k = 0.4; - num minX = -10; - num maxX = 10; + const num x0 = 0; + const num k = 0.4; + const num minX = -10; + const num maxX = 10; - var newX = intervalTrans( + final newX = intervalTrans( x, itervFrom: Tuple2(0, days), - itervTo: Tuple2(minX, maxX), + itervTo: const Tuple2(minX, maxX), ); - var y = 1 / (1 + math.exp(-k * (newX - x0))); + final y = 1 / (1 + math.exp(-k * (newX - x0))); return intervalTrans( y, itervFrom: interv, @@ -53,21 +53,21 @@ num habitGrowCurve( num habitCrowCurveInverse( {int days = 30, num y = 0, Tuple2 interv = _defualtInterv}) { - num x0 = 0; - num k = 0.4; - num minX = -10; - num maxX = 10; + const num x0 = 0; + const num k = 0.4; + const num minX = -10; + const num maxX = 10; - var newY = intervalTrans( + final newY = intervalTrans( y, itervFrom: _defualtInterv, itervTo: interv, ); - var x = x0 - math.log(1 / newY - 1) / k; + final x = x0 - math.log(1 / newY - 1) / k; return intervalTrans( x, - itervFrom: Tuple2(minX, maxX), + itervFrom: const Tuple2(minX, maxX), itervTo: Tuple2(0, days), ); } diff --git a/lib/common/utils.dart b/lib/common/utils.dart index 30b0a90d..d0ac6bfe 100644 --- a/lib/common/utils.dart +++ b/lib/common/utils.dart @@ -40,15 +40,15 @@ ThemeMode transToMaterialThemeType(AppThemeType themeType) { Iterable combineIterables(Iterable first, Iterable second, {required int Function(T a, T b) compare}) sync* { - var firstIterator = first.iterator; - var secondIterator = second.iterator; + final firstIterator = first.iterator; + final secondIterator = second.iterator; var firstHasNext = firstIterator.moveNext(); var secondHasNext = secondIterator.moveNext(); while (firstHasNext && secondHasNext) { - var firstElement = firstIterator.current; - var secondElement = secondIterator.current; + final firstElement = firstIterator.current; + final secondElement = secondIterator.current; if (compare(firstElement, secondElement) <= 0) { yield firstElement; @@ -113,18 +113,18 @@ class TemplateString { } String format(Map params) { - String result = ''; + final result = StringBuffer(); int fixedComponent = 0; - for (int i = 0; i < totalComponents; i++) { + for (var i = 0; i < totalComponents; i++) { if (genericComponents.containsKey(i)) { - result += params[genericComponents[i]].toString(); - continue; + result.write(params[genericComponents[i]]); + } else { + result.write(fixedComponents[fixedComponent++]); } - result += fixedComponents[fixedComponent++]; } - return result; + return result.toString(); } } @@ -136,12 +136,12 @@ String truncateString(String s, int x, int l, int r, {String midStr = "..."}) { } String genHabitUUID() { - var uuid = const Uuid(); + const uuid = Uuid(); return uuid.v4(); } String genRecordUUID() { - var uuid = const Uuid(); + const uuid = Uuid(); return uuid.v4(); } @@ -178,7 +178,7 @@ Iterable> getContinuousRanges(List input) sync* { String? encodeUrlQueryParameters(Map params) { return params.entries - .map((MapEntry e) => + .map((e) => '${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}') .join('&'); } diff --git a/lib/component/widgets/color_display_chip.dart b/lib/component/widgets/color_display_chip.dart index 3a3233b0..3d4829a5 100644 --- a/lib/component/widgets/color_display_chip.dart +++ b/lib/component/widgets/color_display_chip.dart @@ -26,7 +26,7 @@ class ColorDisplayChip extends StatelessWidget { @override Widget build(BuildContext context) { - CustomColors? colorData = Theme.of(context).extension(); + final CustomColors? colorData = Theme.of(context).extension(); return IntrinsicHeight( child: Row( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/component/widgets/crypto_donate_button.dart b/lib/component/widgets/crypto_donate_button.dart index afb16a7d..cc9e748c 100644 --- a/lib/component/widgets/crypto_donate_button.dart +++ b/lib/component/widgets/crypto_donate_button.dart @@ -61,10 +61,9 @@ class CryptoDonateButton extends StatelessWidget { backgroundColor: color, iconColor: const MaterialStatePropertyAll(Colors.white), overlayColor: MaterialStateProperty.resolveWith( - (Set states) => - states.contains(MaterialState.pressed) - ? color.value.darken(0.1) - : null, + (states) => states.contains(MaterialState.pressed) + ? color.value.darken(0.1) + : null, ), ); diff --git a/lib/component/widgets/data_container.dart b/lib/component/widgets/data_container.dart index da5dd182..a1b8e93e 100644 --- a/lib/component/widgets/data_container.dart +++ b/lib/component/widgets/data_container.dart @@ -25,19 +25,19 @@ class DateContainer extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData theme = Theme.of(context); + final ThemeData theme = Theme.of(context); var labelStyle = theme.textTheme.labelMedium ?.copyWith(color: theme.colorScheme.onSurface); - var today = DateTime.now(); - var showDate = date ?? today; - var content = []; + final today = DateTime.now(); + final showDate = date ?? today; + final content = []; if (showDate.isSameDate(today)) { labelStyle = labelStyle?.copyWith(color: theme.colorScheme.primary); } else if (showDate.difference(today).inDays.abs() == 1) { labelStyle = labelStyle?.copyWith(color: theme.colorScheme.secondary); } - var localeString = Localizations.localeOf(context).toLanguageTag(); + final localeString = Localizations.localeOf(context).toLanguageTag(); content.addAll([ Text(DateFormat("MM/dd", localeString).format(showDate), style: labelStyle), diff --git a/lib/component/widgets/date_picker.dart b/lib/component/widgets/date_picker.dart index ce8847dd..3ef983dc 100644 --- a/lib/component/widgets/date_picker.dart +++ b/lib/component/widgets/date_picker.dart @@ -307,7 +307,7 @@ class _HabitDatetimePickerDialog extends State entryModeButton: entryModeButton, ); - bool isTodaySelected = _selectedDate.value == widget.currentDate; + final bool isTodaySelected = _selectedDate.value == widget.currentDate; final Widget todayChip = ChoiceChip( iconTheme: IconThemeData(color: colorScheme.primary), avatar: @@ -320,7 +320,7 @@ class _HabitDatetimePickerDialog extends State onSelected: (value) => _handleDateChanged(widget.currentDate), ); - bool isTomorrowSelected = _selectedDate.value == tomorrowDate; + final bool isTomorrowSelected = _selectedDate.value == tomorrowDate; final Widget tomorrowChip = ChoiceChip( iconTheme: IconThemeData(color: colorScheme.primary), avatar: isTomorrowSelected @@ -334,7 +334,7 @@ class _HabitDatetimePickerDialog extends State onSelected: (value) => _handleDateChanged(tomorrowDate), ); - bool isNextDateSelected = _selectedDate.value == nextDate; + final bool isNextDateSelected = _selectedDate.value == nextDate; final Widget nextDateChip = ChoiceChip( iconTheme: IconThemeData(color: colorScheme.primary), avatar: isNextDateSelected @@ -357,7 +357,7 @@ class _HabitDatetimePickerDialog extends State Widget? otherDateChip; if (otherDate != null) { - bool isOtherDateSelected = _selectedDate.value == otherDate; + final bool isOtherDateSelected = _selectedDate.value == otherDate; otherDateChip = ChoiceChip( iconTheme: IconThemeData(color: colorScheme.primary), avatar: isOtherDateSelected @@ -404,7 +404,7 @@ class _HabitDatetimePickerDialog extends State data: MediaQuery.of(context).copyWith( textScaleFactor: textScaleFactor, ), - child: Builder(builder: (BuildContext context) { + child: Builder(builder: (context) { switch (orientation) { case Orientation.portrait: return Column( diff --git a/lib/component/widgets/habit_calendar_space_bar.dart b/lib/component/widgets/habit_calendar_space_bar.dart index b7c7e9c9..6a439c81 100644 --- a/lib/component/widgets/habit_calendar_space_bar.dart +++ b/lib/component/widgets/habit_calendar_space_bar.dart @@ -51,7 +51,7 @@ class HabitCalendarSpaceBar extends StatelessWidget { @override Widget build(BuildContext context) { - DateTime crtDate = startDate ?? DateTime.now(); + final DateTime crtDate = startDate ?? DateTime.now(); int? limitItemCount; if (endDate == null) { diff --git a/lib/component/widgets/habit_daily_status_container.dart b/lib/component/widgets/habit_daily_status_container.dart index 29e7c39d..70078302 100644 --- a/lib/component/widgets/habit_daily_status_container.dart +++ b/lib/component/widgets/habit_daily_status_container.dart @@ -61,10 +61,10 @@ class HabitDailyStatusContainer extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - var habitListTileColor = themeData.extension(); - var globalColor = themeData.extension(); - var defaultColor = _getDefaultDailyStatusColor(themeData); + final ThemeData themeData = Theme.of(context); + final habitListTileColor = themeData.extension(); + final globalColor = themeData.extension(); + final defaultColor = _getDefaultDailyStatusColor(themeData); Widget withAutoMarkStatus() { return Icon( @@ -198,7 +198,7 @@ class HabitDailyStatusContainer extends StatelessWidget { HabitSummaryDailyStatusColor _getDefaultDailyStatusColor( ThemeData themeData) { - CustomColors? colorData = themeData.extension(); + final CustomColors? colorData = themeData.extension(); return HabitSummaryDailyStatusColor( autoMark: colorData?.getColor(colorType), unknown: themeData.colorScheme.outlineOpacity48, diff --git a/lib/component/widgets/habit_freq_chart.dart b/lib/component/widgets/habit_freq_chart.dart index 5ee995f0..4e96b1cf 100644 --- a/lib/component/widgets/habit_freq_chart.dart +++ b/lib/component/widgets/habit_freq_chart.dart @@ -129,11 +129,11 @@ class HabitFreqChart extends StatelessWidget { } List _buildBarGroupListWithValue() { - var result = []; + final result = []; data.forEachIndexed((i, e) { - var record = e.value, index = data.length - i - 1; + final record = e.value, index = data.length - i - 1; - var includeList = []; + final includeList = []; var currentHeight = 0.0; includeList.add({ 'fromY': currentHeight, @@ -160,12 +160,12 @@ class HabitFreqChart extends StatelessWidget { }); currentHeight += record.overfulfilTotalValue; - var barRods = []; + final barRods = []; includeList.forEachIndexed((index, element) { - var radius = index == includeList.length - 1 + final radius = index == includeList.length - 1 ? kHabitFreqChartTopRadius : BorderRadius.zero; - var rodData = BarChartRodData( + final rodData = BarChartRodData( fromY: element["fromY"], toY: element["toY"], color: element["color"], @@ -175,7 +175,7 @@ class HabitFreqChart extends StatelessWidget { barRods.add(rodData); }); - var cell = BarChartGroupData( + final cell = BarChartGroupData( x: index, groupVertically: true, barRods: barRods, @@ -240,8 +240,8 @@ class HabitFreqChart extends StatelessWidget { } Widget _buildBottomTitle(BuildContext context, double value, TitleMeta meta) { - var index = math.max(0, data.length - value - 1).toInt(); - var date = data[index].key; + final index = math.max(0, data.length - value - 1).toInt(); + final date = data[index].key; return SideTitleWidget( axisSide: meta.axisSide, child: _buildBottomTitleCell(context, date, value), @@ -312,13 +312,8 @@ class HabitFreqChart extends StatelessWidget { tooltipBgColor: Colors.transparent, tooltipPadding: EdgeInsets.zero, tooltipMargin: 2, - getTooltipItem: ( - BarChartGroupData group, - int groupIndex, - BarChartRodData rod, - int rodIndex, - ) { - var value = rod.toY.round(); + getTooltipItem: (group, groupIndex, rod, rodIndex) { + final value = rod.toY.round(); if (value == 0) return null; return BarTooltipItem( NumberFormat.compact().format(value), diff --git a/lib/component/widgets/habit_list_tile.dart b/lib/component/widgets/habit_list_tile.dart index 2e654865..3cf682c3 100644 --- a/lib/component/widgets/habit_list_tile.dart +++ b/lib/component/widgets/habit_list_tile.dart @@ -95,7 +95,7 @@ class HabitListTile extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); + final ThemeData themeData = Theme.of(context); Widget rightBuilder(BuildContext context, int? itemCount, double limitItemSize, double height) { @@ -123,11 +123,11 @@ class HabitListTile extends StatelessWidget { Widget tileBuilder(BuildContext context, BoxConstraints constraints) { final height = _itemHeight ?? constraints.maxHeight; - int limitItemCount = calcLimitItemCount( + final int limitItemCount = calcLimitItemCount( constraints.maxWidth, height, sizePrt, minCount: minItemCoun); - double limitItemSize = calcLimitItemSize(height, limitItemCount); + final double limitItemSize = calcLimitItemSize(height, limitItemCount); int? itemCount; if (!useDefaultItemCount) { @@ -138,11 +138,11 @@ class HabitListTile extends StatelessWidget { } } - Widget rowWidget = Row( + final Widget rowWidget = Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: () { - var result = []; + final result = []; if (leftChild != null) result.add(leftChild!); result.add( Flexible( @@ -183,9 +183,7 @@ class HabitListTile extends StatelessWidget { color: themeData.colorScheme.surface, surfaceTintColor: themeData.colorScheme.surfaceTint, child: LayoutBuilder( - builder: (context, constraints) { - return tileBuilder(context, constraints); - }, + builder: tileBuilder, ), ), ), diff --git a/lib/component/widgets/habit_progress_indicator.dart b/lib/component/widgets/habit_progress_indicator.dart index 6d7e217a..dba135de 100644 --- a/lib/component/widgets/habit_progress_indicator.dart +++ b/lib/component/widgets/habit_progress_indicator.dart @@ -141,7 +141,7 @@ class _HabitProgressIndicator extends State return 0.0; } - var indicator = CircularProgressIndicator( + final indicator = CircularProgressIndicator( backgroundColor: widget.backgroundColor, valueColor: AlwaysStoppedAnimation(widget.color ?? colorScheme.primary), diff --git a/lib/component/widgets/habit_score_chart.dart b/lib/component/widgets/habit_score_chart.dart index 605b22e1..00c394b8 100644 --- a/lib/component/widgets/habit_score_chart.dart +++ b/lib/component/widgets/habit_score_chart.dart @@ -61,12 +61,12 @@ class HabitScoreChart extends StatelessWidget { Size get protoLeftWidgetSize => calcTextSize('100', leftTipsTextStyle); LineChartBarData _buildLineChartBarData(BuildContext context) { - ThemeData theme = Theme.of(context); + final ThemeData theme = Theme.of(context); LineChartBarData result; - var spots = []; + final spots = []; data.forEachIndexed((i, e) { - var record = e.value, index = data.length - i - 1; + final record = e.value, index = data.length - i - 1; spots.add(FlSpot(index.toDouble(), record.avgScore.toDouble())); }); result = LineChartBarData( @@ -90,7 +90,7 @@ class HabitScoreChart extends StatelessWidget { TouchedSpotIndicatorData? _buildTouchedSpotData( BuildContext context, LineChartBarData barData, int spotIndexes) { - ThemeData theme = Theme.of(context); + final ThemeData theme = Theme.of(context); return TouchedSpotIndicatorData( const FlLine(color: Colors.transparent), @@ -187,8 +187,8 @@ class HabitScoreChart extends StatelessWidget { } Widget _buildBottomTitle(BuildContext context, double value, TitleMeta meta) { - var index = math.max(0, data.length - math.max(0, value) - 1).ceil(); - var date = data[index].key; + final index = math.max(0, data.length - math.max(0, value) - 1).ceil(); + final date = data[index].key; if (value > 0 && meta.min == value) { return SideTitleWidget( axisSide: meta.axisSide, @@ -263,11 +263,11 @@ class HabitScoreChart extends StatelessWidget { math.min(MediaQuery.textScaleFactorOf(context), 1.3); appLog.build.debug(context); - double maxX = (data.length - 1).toDouble(); - double initMinX = + final double maxX = (data.length - 1).toDouble(); + final double initMinX = limit != null ? maxX * math.max((1 - limit! / data.length), 0) : 0; - var titlesData = FlTitlesData( + final titlesData = FlTitlesData( topTitles: const AxisTitles(), leftTitles: AxisTitles( sideTitles: SideTitles( @@ -289,7 +289,7 @@ class HabitScoreChart extends StatelessWidget { ), ); - var lineTouchData = LineTouchData( + final lineTouchData = LineTouchData( getTouchedSpotIndicator: (barData, spotIndexes) => spotIndexes .map( (spotIndex) => _buildTouchedSpotData(context, barData, spotIndex)) @@ -300,8 +300,8 @@ class HabitScoreChart extends StatelessWidget { tooltipMargin: 10, showOnTopOfTheChartBoxArea: true, getTooltipItems: (touchedSpots) { - var sp = touchedSpots[0]; - var result = LineTooltipItem( + final sp = touchedSpots[0]; + final result = LineTooltipItem( sp.y.toStringAsFixed(2), TextStyle( color: sp.bar.gradient?.colors[0] ?? sp.bar.color, @@ -312,7 +312,7 @@ class HabitScoreChart extends StatelessWidget { ), ); - var gridData = FlGridData( + final gridData = FlGridData( show: true, drawVerticalLine: false, drawHorizontalLine: true, diff --git a/lib/component/widgets/month_picker_cell.dart b/lib/component/widgets/month_picker_cell.dart index 7a7ca307..10be5bb1 100644 --- a/lib/component/widgets/month_picker_cell.dart +++ b/lib/component/widgets/month_picker_cell.dart @@ -43,8 +43,8 @@ class MonthPickerCell extends StatelessWidget { }) : assert(monthday > 0 && monthday < 32); Color? getBackgroundColor(BuildContext context) { - ThemeData theme = Theme.of(context); - CustomColors? colorData = theme.extension(); + final ThemeData theme = Theme.of(context); + final CustomColors? colorData = theme.extension(); if (selected) { return (colorType != null ? colorData?.getColor(colorType!) : null) ?? @@ -55,8 +55,8 @@ class MonthPickerCell extends StatelessWidget { } TextStyle? getTextStyle(BuildContext context) { - ThemeData theme = Theme.of(context); - CustomColors? colorData = theme.extension(); + final ThemeData theme = Theme.of(context); + final CustomColors? colorData = theme.extension(); if (selected) { return selectedStyle ?? diff --git a/lib/component/widgets/scrollable_chart.dart b/lib/component/widgets/scrollable_chart.dart index 55744fb7..345e83dd 100644 --- a/lib/component/widgets/scrollable_chart.dart +++ b/lib/component/widgets/scrollable_chart.dart @@ -95,7 +95,7 @@ class _ScrollableChartState extends State } void _onScroll(double horizontalDistance, {bool refresh = true}) { - var lastMinMaxDistance = math.max(lastMaxXValue - lastMinXValue, 0.0); + final lastMinMaxDistance = math.max(lastMaxXValue - lastMinXValue, 0.0); lastCacheMinX = lastCacheMinX ?? minX; lastCacheMaxX = lastCacheMaxX ?? maxX; @@ -131,7 +131,7 @@ class _ScrollableChartState extends State } void _onHorizontalDragUpdate(DragUpdateDetails details) { - var horizontalDistance = details.primaryDelta ?? 0; + final horizontalDistance = details.primaryDelta ?? 0; if (horizontalDistance == 0) return; _lastDistance = horizontalDistance; _onScroll(horizontalDistance); diff --git a/lib/component/widgets/scrolling_fab.dart b/lib/component/widgets/scrolling_fab.dart index bfa09e9e..19fe4781 100644 --- a/lib/component/widgets/scrolling_fab.dart +++ b/lib/component/widgets/scrolling_fab.dart @@ -118,8 +118,9 @@ class ScrollingFAB extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData theme = Theme.of(context); - FloatingActionButtonThemeData fabTheme = theme.floatingActionButtonTheme + final ThemeData theme = Theme.of(context); + final FloatingActionButtonThemeData fabTheme = theme + .floatingActionButtonTheme .copyWith(extendedSizeConstraints: getExtendedSizeConstraints(context)); appLog.build.debug(context, ex: [isExtended, _extendedLabel, child]); @@ -133,8 +134,7 @@ class ScrollingFAB extends StatelessWidget { onPressed: onPressed, label: AnimatedSwitcher( duration: const Duration(milliseconds: 200), - transitionBuilder: (Widget child, Animation animation) => - FadeTransition( + transitionBuilder: (child, animation) => FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, diff --git a/lib/component/widgets/week_picker_cell.dart b/lib/component/widgets/week_picker_cell.dart index 71640022..03c04233 100644 --- a/lib/component/widgets/week_picker_cell.dart +++ b/lib/component/widgets/week_picker_cell.dart @@ -45,8 +45,8 @@ class WeekPickerCell extends StatelessWidget { }) : assert(weekday > 0 && weekday < 8); Color? getBackgroundColor(BuildContext context) { - ThemeData theme = Theme.of(context); - CustomColors? colorData = theme.extension(); + final ThemeData theme = Theme.of(context); + final CustomColors? colorData = theme.extension(); if (selected) { return (colorType != null ? colorData?.getColor(colorType!) : null) ?? @@ -57,8 +57,8 @@ class WeekPickerCell extends StatelessWidget { } TextStyle? getTextStyle(BuildContext context) { - ThemeData theme = Theme.of(context); - CustomColors? colorData = theme.extension(); + final ThemeData theme = Theme.of(context); + final CustomColors? colorData = theme.extension(); if (selected) { return selectedStyle ?? diff --git a/lib/extension/num_extensions.dart b/lib/extension/num_extensions.dart index 7a74bbac..23c05b15 100644 --- a/lib/extension/num_extensions.dart +++ b/lib/extension/num_extensions.dart @@ -27,7 +27,7 @@ extension NumExtension on num { String toStringAsFixedWithMin(int fixedDigit) { if (this == 0) return toStringAsFixed(fixedDigit); - var minNum = pow(10, -fixedDigit); + final minNum = pow(10, -fixedDigit); if (abs() >= minNum) { return toStringAsFixed(fixedDigit); } else { diff --git a/lib/extension/string_extensions.dart b/lib/extension/string_extensions.dart index 96e86aba..363a2c65 100644 --- a/lib/extension/string_extensions.dart +++ b/lib/extension/string_extensions.dart @@ -13,5 +13,5 @@ // limitations under the License. extension UUIDStringExtensions on String { - toUUIDInt() => int.parse(replaceAll('-', ''), radix: 16); + int toUUIDInt() => int.parse(replaceAll('-', ''), radix: 16); } diff --git a/lib/logging/handler/console_printer.dart b/lib/logging/handler/console_printer.dart index 572538ce..6fabaad1 100644 --- a/lib/logging/handler/console_printer.dart +++ b/lib/logging/handler/console_printer.dart @@ -42,13 +42,9 @@ class AppLoggerConsolePrinter List log(l.LogEvent event) { final T? message = event.message; - Iterable iterPrefix() sync* { - yield "[${prefixMap[event.level]}]"; - } - return [ [ - iterPrefix().whereNotNull().join(" "), + "[${prefixMap[event.level]}]", " - ", if (message != null) message.toLogPrinterMessage().whereNotNull().join(" | "), @@ -87,27 +83,18 @@ class AppLoggerConsoleReleasePrinter List log(l.LogEvent event) { final T? message = event.message; - Iterable iterPrefix() sync* { - yield "[app:${message?.type.name ?? ''}:${Isolate.current.debugName}]"; - yield "[${prefixMap[event.level]}]"; - } - - Iterable iterMergesMsg({bool addTime = false}) sync* { - yield iterPrefix().whereNotNull().join(" "); - yield " - "; - if (addTime) { - yield _errorPrinter.getTime(event.time); - yield " - "; - } - if (message != null) { - yield message.toLogPrinterMessage().whereNotNull().join(" | "); - } - } + String getMsg({bool addTime = false}) => [ + "[app:${message?.type.name ?? ''}:${Isolate.current.debugName}]" + " [${prefixMap[event.level]}]", + if (addTime) _errorPrinter.getTime(event.time), + if (message != null) + message.toLogPrinterMessage().whereNotNull().join(" | "), + ].join(" - "); if (event.level.value >= l.Level.error.value) { - return _errorPrinter.log(event.copyWith(message: iterMergesMsg().join())); + return _errorPrinter.log(event.copyWith(message: getMsg())); } - return [iterMergesMsg(addTime: true).join()]; + return [getMsg()]; } } diff --git a/lib/logging/logger/text_logger.dart b/lib/logging/logger/text_logger.dart index a73f1e22..4e854ab1 100644 --- a/lib/logging/logger/text_logger.dart +++ b/lib/logging/logger/text_logger.dart @@ -30,12 +30,11 @@ class AppTextLoggerMessage implements AppLoggerMessage { const AppTextLoggerMessage(this.type, {this.message, this.extraInfo}); @override - Iterable toLogPrinterMessage() sync* { - if (message != null) yield message; - if (extraInfo != null) { - yield* extraInfo!.where((e) => e != null).map((e) => e.toString()); - } - } + Iterable toLogPrinterMessage() => [ + if (message != null) message, + if (extraInfo != null) + ...extraInfo!.where((e) => e != null).map((e) => e.toString()), + ]; } abstract interface class AppTextLogger { diff --git a/lib/logging/logger/widget_logger.dart b/lib/logging/logger/widget_logger.dart index b633bd6a..73113f98 100644 --- a/lib/logging/logger/widget_logger.dart +++ b/lib/logging/logger/widget_logger.dart @@ -33,16 +33,19 @@ class AppWidgetLoggerMessage implements AppLoggerMessage { {this.widget, this.extraInfo, this.name}); @override - Iterable toLogPrinterMessage() sync* { + Iterable toLogPrinterMessage() { + final result = []; if (widget != null) { - yield "${name ?? widget!.runtimeType}" - "[${widget!.key},${widget!.hashCode}]"; + result.add( + "${name ?? widget!.runtimeType}[${widget!.key},${widget!.hashCode}]"); } else if (name != null) { - yield name; + result.add(name!); } if (extraInfo != null) { - yield* extraInfo!.where((e) => e != null).map((e) => e.toString()); + result + .addAll(extraInfo!.where((e) => e != null).map((e) => e.toString())); } + return result; } } diff --git a/lib/model/_score/data.dart b/lib/model/_score/data.dart index 10b373d7..8b4dfb5d 100644 --- a/lib/model/_score/data.dart +++ b/lib/model/_score/data.dart @@ -36,7 +36,7 @@ class HabitScoreChangedProtoData { return; } - var changed = dailyScoreChangedValue; + final changed = dailyScoreChangedValue; var crtDate = fromDate; var crtScore = fromScore; diff --git a/lib/model/habit_date.dart b/lib/model/habit_date.dart index 348510d4..db164eae 100644 --- a/lib/model/habit_date.dart +++ b/lib/model/habit_date.dart @@ -22,7 +22,7 @@ class HabitDate implements DateTime, DateTimeExtensionsABC { : _date = DateTime.utc(year, month, day); HabitDate.now() { - var now = DateTime.now(); + final now = DateTime.now(); _date = DateTime.utc(now.year, now.month, now.day); } diff --git a/lib/model/habit_export.dart b/lib/model/habit_export.dart index 4fca4ac9..4e6bf403 100644 --- a/lib/model/habit_export.dart +++ b/lib/model/habit_export.dart @@ -194,11 +194,8 @@ class HabitExportData implements JsonAdaptor { @override Map toJson() => _$HabitExportDataToJson(this); - Iterable getRecordDBCells() sync* { - for (var record in records) { - yield record.toRecordDBCell(); - } - } + Iterable getRecordDBCells() => + records.map((e) => e.toRecordDBCell()); static List> _recordsToJson( List records) { diff --git a/lib/model/habit_freq.dart b/lib/model/habit_freq.dart index 036a85ab..b83b27f0 100644 --- a/lib/model/habit_freq.dart +++ b/lib/model/habit_freq.dart @@ -75,7 +75,7 @@ class HabitFrequency { } JsonMap toJson() { - Map result = {"type": type.dbCode}; + final Map result = {"type": type.dbCode}; switch (type) { case HabitFrequencyType.weekly: result["args"] = [freq]; diff --git a/lib/model/habit_score.dart b/lib/model/habit_score.dart index d21d995f..5ffab65d 100644 --- a/lib/model/habit_score.dart +++ b/lib/model/habit_score.dart @@ -13,6 +13,6 @@ // limitations under the License. export './_score/calculator.dart' - show HabitScoreCalculator, ArchivedHabitScoreCalculator; + show ArchivedHabitScoreCalculator, HabitScoreCalculator; export './_score/data.dart' show HabitScoreChangedProtoData; export '_score/score.dart'; diff --git a/lib/model/habit_stat.dart b/lib/model/habit_stat.dart index f70963fb..9621d63e 100644 --- a/lib/model/habit_stat.dart +++ b/lib/model/habit_stat.dart @@ -31,7 +31,7 @@ class HabitSummarySelectedStatistic { int get selected => activated + archived; @override - operator ==(Object? other) { + bool operator ==(Object? other) { if (other is! HabitSummarySelectedStatistic) return false; return activated == other.activated && archived == other.archived; } @@ -59,7 +59,7 @@ class HabitRangeDayStatistic { num get changed => enededProgress - startProgress; num getLast30DaysChanged(HabitDate initDate) { - var firstDate = initDate.subtractDays(30); + final firstDate = initDate.subtractDays(30); if (firstDate <= lastStartRecordData) { return enededProgress - 0; } else { @@ -107,7 +107,7 @@ class HabitLast30DaysProgressChangeData { void addStatistic( HabitSummaryData data, HabitDate initDate, HabitDate date, num score) { - var firstDate = initDate.subtractDays(30); + final firstDate = initDate.subtractDays(30); if (date < firstDate || date > initDate) return; _dirty = true; if (!_cacheData.containsKey(data.uuid)) { @@ -121,7 +121,7 @@ class HabitLast30DaysProgressChangeData { return; } - var orgRecord = _cacheData[data.uuid]!; + final orgRecord = _cacheData[data.uuid]!; if (date < orgRecord.lastStartRecordData && orgRecord.startProgress != score) { _cacheData[data.uuid] = _cacheData[data.uuid]!.copyWith( diff --git a/lib/model/habit_summary.dart b/lib/model/habit_summary.dart index d2823f97..4a78eec5 100644 --- a/lib/model/habit_summary.dart +++ b/lib/model/habit_summary.dart @@ -91,20 +91,17 @@ mixin _HabitSummaryDataRecordsMixin { _recordDateCacheMap.clear(); } - Iterable getAllRecord() sync* { - for (var r in _recordDateCacheMap.entries) { - yield r.value; - } - } + Iterable getAllRecord() => + _recordDateCacheMap.entries.map((e) => e.value); HabitSummaryRecord? removeRecordWithUUID(HabitRecordUUID uuid) { - var result = _recordMap.remove(uuid); + final result = _recordMap.remove(uuid); if (result != null) _recordDateCacheMap.remove(result.date); return result; } HabitSummaryRecord? removeRecordWithDate(HabitRecordDate date) { - var result = _recordDateCacheMap.remove(date); + final result = _recordDateCacheMap.remove(date); if (result != null) _recordMap.remove(result.uuid); return result; } @@ -125,7 +122,7 @@ mixin _HabitSummaryDataRecordsMixin { bool addAllRecords(Iterable records, {HabitReocrdAddRepeatedBehaviour behaviour = HabitReocrdAddRepeatedBehaviour.failed}) { - var tmpList = []; + final tmpList = []; for (final r in records) { if (_recordMap.containsKey(r.uuid) || _recordDateCacheMap.containsKey(r.date)) { @@ -237,11 +234,8 @@ class HabitSummaryData with _HabitSummaryDataRecordsMixin, DirtyMarkMixin { } } - Iterable getAllAutoComplateRecordDate() sync* { - for (var r in _autoMarkedRecords) { - yield r; - } - } + Iterable getAllAutoComplateRecordDate() => + _autoMarkedRecords; Set debugGetAutoMarkedRecordsCopy() { assert(kDebugMode); @@ -312,7 +306,7 @@ class HabitSummaryData with _HabitSummaryDataRecordsMixin, DirtyMarkMixin { habitScore: createHabitScore(), startDate: startDate, iterable: createIterable(), - isAutoComplated: (date) => _autoMarkedRecords.contains(date), + isAutoComplated: _autoMarkedRecords.contains, getHabitRecord: (date) => _recordDateCacheMap[date], ); } else { @@ -320,7 +314,7 @@ class HabitSummaryData with _HabitSummaryDataRecordsMixin, DirtyMarkMixin { habitScore: createHabitScore(), startDate: startDate, iterable: createIterable(), - isAutoComplated: (date) => _autoMarkedRecords.contains(date), + isAutoComplated: _autoMarkedRecords.contains, getHabitRecord: (date) => _recordDateCacheMap[date], ); } @@ -366,7 +360,7 @@ class HabitSummaryData with _HabitSummaryDataRecordsMixin, DirtyMarkMixin { } for (var i = 0; i < insideDays; i++) { - var insideMarkDate = window.first.addDays(i); + final insideMarkDate = window.first.addDays(i); // debugPrint("inside add [$insideDays]: $insideMarkDate"); markedDateSet.add(insideMarkDate); } @@ -375,7 +369,7 @@ class HabitSummaryData with _HabitSummaryDataRecordsMixin, DirtyMarkMixin { final leftLastDays = lastDays; for (var i = 1; i <= leftLastDays; i++) { - var leftMarkDate = window.first.subtractDays(i); + final leftMarkDate = window.first.subtractDays(i); if (markedDateSet.contains(leftMarkDate) || leftMarkDate < startDate) { break; } @@ -539,7 +533,7 @@ class HabitSummaryDataCollection { Iterable result, Iterable recordResult) { _dataMap.clear(); for (final cell in result) { - var data = HabitSummaryData.fromDBQueryCell(cell); + final data = HabitSummaryData.fromDBQueryCell(cell); _dataMap[data.uuid] = data; } for (final cell in recordResult) { @@ -672,7 +666,7 @@ class HabitSummaryDataCollection { result = List.from( _dataMap.values.toList() ..sort((a, b) { - var r1 = a.sortPostion.compareTo(b.sortPostion); + final r1 = a.sortPostion.compareTo(b.sortPostion); if (r1 != 0) { return r1; } else { @@ -704,7 +698,7 @@ class HabitSummaryDataCollection { @override String toString() { - List dataStringList = []; + final List dataStringList = []; _dataMap.forEach((key, value) { final valueStr = truncateString(value.toString(), 120, 100, 10); dataStringList.add(" $valueStr"); diff --git a/lib/persistent/db_helper_provider.dart b/lib/persistent/db_helper_provider.dart index 808e569f..14c01159 100644 --- a/lib/persistent/db_helper_provider.dart +++ b/lib/persistent/db_helper_provider.dart @@ -133,7 +133,7 @@ mixin DBOperationsMixin on DBHelperLoadedMixin { if (cell == null) return null; final habit = HabitSummaryData.fromDBQueryCell(cell); habit.initRecords( - records.map((e) => HabitSummaryRecord.fromDBQueryCell(e)), + records.map(HabitSummaryRecord.fromDBQueryCell), ); habit.reCalculateAutoComplateRecords(firstDay: firstDay); return habit; diff --git a/lib/persistent/local/db_helper.dart b/lib/persistent/local/db_helper.dart index a78ec0d0..ca6e826b 100644 --- a/lib/persistent/local/db_helper.dart +++ b/lib/persistent/local/db_helper.dart @@ -55,9 +55,7 @@ class _DBHelper implements DBHelper { final indexesBatch = db.batch(); const LineSplitter() .convert(await getSqlFromFile(Assets.sql.indexes)) - .forEach((sql) { - indexesBatch.execute(sql); - }); + .forEach(indexesBatch.execute); await indexesBatch.commit(); await db.execute(CustomSql.autoUpdateHabitssModifyTimeTrigger); await db.execute(CustomSql.autoUpdateRecordsModifyTimeTrigger); @@ -110,7 +108,7 @@ class _DBHelper implements DBHelper { @override Future init({bool reinit = false}) async { - String dbPath = join(await getDatabasesPath(), appDBName); + final String dbPath = join(await getDatabasesPath(), appDBName); Future initNew() async { appLog.db.info("local.$runtimeType.init", ex: ["processing"]); diff --git a/lib/persistent/local/handler/habit.dart b/lib/persistent/local/handler/habit.dart index 21b66fa9..8892335e 100644 --- a/lib/persistent/local/handler/habit.dart +++ b/lib/persistent/local/handler/habit.dart @@ -20,9 +20,9 @@ import 'package:sqflite/sqflite.dart'; import '../../../common/consts.dart'; import '../../../common/types.dart'; import '../../../model/habit_form.dart'; -import '../table.dart'; import '../db_cell.dart'; import '../db_helper.dart'; +import '../table.dart'; part 'habit.g.dart'; @@ -230,7 +230,7 @@ class HabitDBHelper extends DBHelperHandler { where: "${HabitDBCellKey.status} " "IN (${queryArgs.map((e) => '?').join(', ')})", whereArgs: queryArgs); - return result.map((e) => HabitDBCell.fromJson(e)); + return result.map(HabitDBCell.fromJson); } Future updateSelectedHabitsSortPostion( @@ -265,11 +265,11 @@ class HabitDBHelper extends DBHelperHandler { "IN (${uuidList.map((e) => '?').join(', ')}) ", whereArgs: uuidList, orderBy: HabitDBCellKey.sortPosition); - return results.map((e) => HabitDBCell.fromJson(e)); + return results.map(HabitDBCell.fromJson); } Future> loadAllHabitExportData() async { final results = await db.query(table, orderBy: HabitDBCellKey.sortPosition); - return results.map((e) => HabitDBCell.fromJson(e)); + return results.map(HabitDBCell.fromJson); } } diff --git a/lib/persistent/local/handler/record.dart b/lib/persistent/local/handler/record.dart index ced0a5e2..3c8eaa59 100644 --- a/lib/persistent/local/handler/record.dart +++ b/lib/persistent/local/handler/record.dart @@ -134,7 +134,7 @@ WHERE $table.${RecordDBCellKey.recordDate} $table.${RecordDBCellKey.parentUUID} = "$uuid"; """; final results = await db.rawQuery(sql); - return results.map((e) => RecordDBCell.fromJson(e)); + return results.map(RecordDBCell.fromJson); } Future loadSingleRecord(HabitRecordUUID uuid) async { @@ -153,7 +153,7 @@ WHERE $table.${RecordDBCellKey.recordDate} Future> loadAllRecords() async { final results = await db.query(table, columns: _loadAllRecordDataColumns); - return results.map((e) => RecordDBCell.fromJson(e)); + return results.map(RecordDBCell.fromJson); } Future> loadRecordsExportData( @@ -164,11 +164,11 @@ WHERE $table.${RecordDBCellKey.recordDate} where: "${RecordDBCellKey.parentUUID} " "IN (${uuidList.map((e) => '?').join(', ')})", whereArgs: uuidList); - return results.map((e) => RecordDBCell.fromJson(e)); + return results.map(RecordDBCell.fromJson); } Future> loadAllRecordsExportData() async { final results = await db.query(table); - return results.map((e) => RecordDBCell.fromJson(e)); + return results.map(RecordDBCell.fromJson); } } diff --git a/lib/provider/app_caches.dart b/lib/provider/app_caches.dart index 4cbc1b57..0483dffa 100644 --- a/lib/provider/app_caches.dart +++ b/lib/provider/app_caches.dart @@ -46,10 +46,9 @@ class AppCachesViewModel with ProfileHandlerLoadedMixin { } Future> clearAllCache() async { - List clearResultList = []; - List futures = [ - if (_inputFill != null) - _inputFill!.clear(onClear: (r) => clearResultList.add(r)), + final List clearResultList = []; + final List futures = [ + if (_inputFill != null) _inputFill!.clear(onClear: clearResultList.add), ]; await Future.wait(futures); return clearResultList; diff --git a/lib/provider/habit_detail.dart b/lib/provider/habit_detail.dart index f5cba642..6c3f6af2 100644 --- a/lib/provider/habit_detail.dart +++ b/lib/provider/habit_detail.dart @@ -190,8 +190,7 @@ class HabitDetailViewModel extends ChangeNotifier return; } final data = HabitDetailData.fromDBQueryCell(cell); - data.data.initRecords( - records.map((e) => HabitSummaryRecord.fromDBQueryCell(e))); + data.data.initRecords(records.map(HabitSummaryRecord.fromDBQueryCell)); _habitDetailData = data; _calcHabitInfo(); appLog.load.debug("$runtimeType.load", @@ -262,7 +261,7 @@ class HabitDetailViewModel extends ChangeNotifier Map get heatmapDateToColorMap => _heatmapDateToColorMap; HabitHeatmapCellStatus getHabitHeatmapCellStatus(HabitDate date) { - var record = getHabitRecordData(date); + final record = getHabitRecordData(date); return HabitHeatmapCellStatus( status: record?.status, value: record?.value, @@ -373,7 +372,7 @@ class HabitDetailViewModel extends ChangeNotifier await saveHabitRecordToDB(data.id, data.uuid, record, isNew: isNew); - var result = data.addRecord(record, replaced: true); + final result = data.addRecord(record, replaced: true); _calcHabitInfo(); appLog.value.info("$runtimeType.onLongPressChangeRecordValue", @@ -508,7 +507,7 @@ class HeatmapColorsCalculator { } Map calculate() { - Map tmpMap = {}; + final Map tmpMap = {}; for (var date in _data.autoRecordsDate) { tmpMap[date] = HabitHeatMapColorMapDefine.autoComplate; diff --git a/lib/provider/habit_detail_freqchart.dart b/lib/provider/habit_detail_freqchart.dart index d7d65ffe..2daeb951 100644 --- a/lib/provider/habit_detail_freqchart.dart +++ b/lib/provider/habit_detail_freqchart.dart @@ -107,7 +107,7 @@ class HabitDetailFreqChartViewModel extends ChangeNotifier { } AxisDirection? consumeCachedAnimateDirection() { - var tmp = _cachedScrollDirection; + final tmp = _cachedScrollDirection; _cachedScrollDirection = null; return tmp; } diff --git a/lib/provider/habit_detail_scorechart.dart b/lib/provider/habit_detail_scorechart.dart index 16cceba4..6b082ca8 100644 --- a/lib/provider/habit_detail_scorechart.dart +++ b/lib/provider/habit_detail_scorechart.dart @@ -81,7 +81,7 @@ class HabitDetailScoreChartViewModel extends ChangeNotifier { } AxisDirection? consumeCachedAnimateDirection() { - var tmp = _cachedScrollDirection; + final tmp = _cachedScrollDirection; _cachedScrollDirection = null; return tmp; } diff --git a/lib/provider/habit_summary.dart b/lib/provider/habit_summary.dart index 81d35beb..5d40f02e 100644 --- a/lib/provider/habit_summary.dart +++ b/lib/provider/habit_summary.dart @@ -311,7 +311,7 @@ class HabitSummaryViewModel extends ChangeNotifier } bool addNewData(HabitSummaryData cell, {bool listen = false}) { - bool addResult = _data.addNewHabit(cell, forceAdd: false); + final bool addResult = _data.addNewHabit(cell, forceAdd: false); final data = _data.getHabitByUUID(cell.uuid); if (data != null) _calcHabitAutoComplateRecords(data); resortData(); @@ -429,7 +429,7 @@ class HabitSummaryViewModel extends ChangeNotifier HabitSummarySelectedStatistic get selectStatistic { int activatedNum = 0; int archivedNum = 0; - for (var data in _selectorData.selectedColl.map((uuid) => getHabit(uuid))) { + for (var data in _selectorData.selectedColl.map(getHabit)) { if (data == null) { continue; } else if (data.status == HabitStatus.activated) { @@ -462,11 +462,8 @@ class HabitSummaryViewModel extends ChangeNotifier if (listen) notifyListeners(); } - Iterable getSelectedHabitsData() sync* { - for (var habitUUID in _selectorData._selectUUIDColl.toList()) { - yield getHabit(habitUUID); - } - } + Iterable getSelectedHabitsData() => + _selectorData._selectUUIDColl.map(getHabit); //#endregion //#region actions diff --git a/lib/provider/habits_file_exporter.dart b/lib/provider/habits_file_exporter.dart index bfe4f06b..b7b81808 100644 --- a/lib/provider/habits_file_exporter.dart +++ b/lib/provider/habits_file_exporter.dart @@ -35,7 +35,7 @@ class HabitFileExporterViewModel extends ChangeNotifier String? suffix}) { dateTime = dateTime ?? DateTime.now(); final dateString = DateFormat('y_MM_dd_H_m_s').format(dateTime); - var fileStringList = [ + final fileStringList = [ if (prefix != null) prefix, dateString, if (suffix != null) suffix, diff --git a/lib/provider/habits_file_importer.dart b/lib/provider/habits_file_importer.dart index 8a76f075..b7427eae 100644 --- a/lib/provider/habits_file_importer.dart +++ b/lib/provider/habits_file_importer.dart @@ -60,7 +60,7 @@ class HabitFileImporterViewModel extends ChangeNotifier if (futures.isEmpty) return false; var completeCount = 0; - var allCount = futures.length; + final allCount = futures.length; for (var future in futures) { future.whenComplete(() { completeCount += 1; diff --git a/lib/view/_debug.dart b/lib/view/_debug.dart index c6d6739d..11401276 100644 --- a/lib/view/_debug.dart +++ b/lib/view/_debug.dart @@ -32,7 +32,7 @@ const _defaultSliverScrollChildCount = 10; class DebugBuilderMethods { static SliverChildDelegate debugBuildSliverScrollDelegate({int? childCount}) { return SliverChildBuilderDelegate( - (BuildContext context, int index) { + (context, index) { return Container( color: index.isOdd ? Colors.white : Colors.black12, height: 100.0, diff --git a/lib/view/app.dart b/lib/view/app.dart index f37760ec..087255a9 100644 --- a/lib/view/app.dart +++ b/lib/view/app.dart @@ -32,28 +32,28 @@ import 'for_app/_widget.dart'; import 'page_habits_display.dart' show PageHabitsDisplay; class App extends StatelessWidget { - const App({super.key}); + static final _profileHandlers = [ + AppReminderProfileHandler.new, + AppThemeTypeProfileHandler.new, + AppThemeMainColorProfileHandler.new, + CompactUISwitcherProfileHandler.new, + DisplaySortModeProfileHandler.new, + DisplayHabitsFilterProfileHandler.new, + DisplayCalendarScrollModeProfileHandler.new, + DisplayCalendartBarOccupyPrtProfileHandler.new, + ShowDateFormatProfileHandler.new, + FirstDayProfileHandler.new, + HabitCellGestureModeProfileHandler.new, + InputFillCacheProfileHandler.new, + ]; - Iterable _buildProfileHanlder() sync* { - yield (pref) => AppReminderProfileHandler(pref); - yield (pref) => AppThemeTypeProfileHandler(pref); - yield (pref) => AppThemeMainColorProfileHandler(pref); - yield (pref) => CompactUISwitcherProfileHandler(pref); - yield (pref) => DisplaySortModeProfileHandler(pref); - yield (pref) => DisplayHabitsFilterProfileHandler(pref); - yield (pref) => DisplayCalendarScrollModeProfileHandler(pref); - yield (pref) => DisplayCalendartBarOccupyPrtProfileHandler(pref); - yield (pref) => ShowDateFormatProfileHandler(pref); - yield (pref) => FirstDayProfileHandler(pref); - yield (pref) => HabitCellGestureModeProfileHandler(pref); - yield (pref) => InputFillCacheProfileHandler(pref); - } + const App({super.key}); @override Widget build(BuildContext context) { debugPrint('------ App start ------'); return ProfileBuilder( - handlers: _buildProfileHanlder(), + handlers: _profileHandlers, builder: (context, child) => DBHelperBuilder( builder: (context, child) => AppProviders(child: child), child: const AppView(), @@ -72,7 +72,7 @@ class AppView extends StatefulWidget { class _AppView extends State { ThemeData _getLightThemeData(BuildContext context, {ColorScheme? dynamicColor, required Color mainColor}) { - ColorScheme appColorLight = ColorScheme.fromSeed( + final ColorScheme appColorLight = ColorScheme.fromSeed( seedColor: mainColor, brightness: Brightness.light, ); @@ -85,7 +85,7 @@ class _AppView extends State { ThemeData _getDartThemeData(BuildContext context, {ColorScheme? dynamicColor, required Color mainColor}) { - ColorScheme appColorDark = ColorScheme.fromSeed( + final ColorScheme appColorDark = ColorScheme.fromSeed( seedColor: mainColor, brightness: Brightness.dark, ); @@ -98,7 +98,7 @@ class _AppView extends State { @override Widget build(BuildContext context) { - var homePage = const PageHabitsDisplay(); + const homePage = PageHabitsDisplay(); return Selector>( selector: (context, viewmodel) => diff --git a/lib/view/common/_dialog.dart b/lib/view/common/_dialog.dart index 5e9bca56..b2334fc1 100644 --- a/lib/view/common/_dialog.dart +++ b/lib/view/common/_dialog.dart @@ -16,8 +16,8 @@ export './confirm_dialog.dart'; export './donate_dialog.dart' show DonateDialog, showDonateDialog; export './exporter_confirm_dialog.dart' show - ExporterConfirmResultType, ExporterConfirmDialog, + ExporterConfirmResultType, showExporterConfirmDialog; export './habit_record_number_picker.dart'; export './habit_record_reason_modifier.dart'; diff --git a/lib/view/common/_widget.dart b/lib/view/common/_widget.dart index 628c8866..29963c56 100644 --- a/lib/view/common/_widget.dart +++ b/lib/view/common/_widget.dart @@ -13,7 +13,7 @@ // limitations under the License. export './appbar_combined_action.dart' - show AppbarActionShowStatus, AppBarActions, AppbarActionItemConfig; + show AppBarActions, AppbarActionItemConfig, AppbarActionShowStatus; export './colorful_navibar.dart' show ColorfulNavibar; export './contributor_tile.dart'; export './date_changer.dart'; diff --git a/lib/view/common/appbar_combined_action.dart b/lib/view/common/appbar_combined_action.dart index 29c51cd3..6687279f 100644 --- a/lib/view/common/appbar_combined_action.dart +++ b/lib/view/common/appbar_combined_action.dart @@ -83,7 +83,7 @@ class AppBarActions ); } - List> children = []; + final List> children = []; for (var config in actionConfigs) { if (config.shouldShow(AppbarActionShowStatus.popupitem)) { children.add(getPopupItem(context, config)); @@ -104,7 +104,7 @@ class AppBarActions ); } - List children = []; + final List children = []; for (var config in actionConfigs) { if (config.shouldShow(AppbarActionShowStatus.button)) { children.add(buildActionButton(context, config)); @@ -125,7 +125,7 @@ class AppBarActions } } }, - itemBuilder: (context) => _getPopupItemList(context), + itemBuilder: _getPopupItemList, ), ], ); diff --git a/lib/view/common/contributor_tile.dart b/lib/view/common/contributor_tile.dart index df6186d3..cac1fb97 100644 --- a/lib/view/common/contributor_tile.dart +++ b/lib/view/common/contributor_tile.dart @@ -56,41 +56,50 @@ class ContributorTile extends StatelessWidget { return Text(info.name); } - Iterable buildContributor(BuildContext context, - [L10n? l10n]) sync* { + Iterable buildContributor(BuildContext context, [L10n? l10n]) { final cs = contributors.getContributors(); - if (cs.isEmpty) return; - yield GroupTitleListTile( - title: Text(l10n?.contributors_tile_title ?? "Contributors")); - yield ListTile( - visualDensity: VisualDensity.compact, - leading: leadingBuilder?.call(null), - title: Wrap( + if (cs.isEmpty) return const []; + return [ + GroupTitleListTile( + title: Text(l10n?.contributors_tile_title ?? "Contributors"), + ), + ListTile( + visualDensity: VisualDensity.compact, + leading: leadingBuilder?.call(null), + title: Wrap( spacing: 12, - children: cs.map((e) => buildContributorCell(context, e)).toList()), - ); + children: cs.map((e) => buildContributorCell(context, e)).toList(), + ), + ), + ]; } - Iterable buildTranslation(BuildContext context, Locale locale, - [L10n? l10n]) sync* { + Iterable buildTranslation(BuildContext context, Locale locale) { final cs = contributors.getTranslations(locale); - if (cs == null || cs.isEmpty) return; - try { - yield GroupTitleListTile( - title: Text(lookupL10n(locale.toLocale()).localeScriptName)); - } on FlutterError catch (e) { - appLog.l10n.warn(context, - widget: this, ex: ["lockup l10n failed", locale], error: e); - yield GroupTitleListTile(title: Text(locale.toString())); + if (cs == null || cs.isEmpty) return const []; + + Widget buildTitle(BuildContext context) { + try { + return GroupTitleListTile( + title: Text(lookupL10n(locale.toLocale()).localeScriptName)); + } on FlutterError catch (e) { + appLog.l10n.warn(context, + widget: this, ex: ["lockup l10n failed", locale], error: e); + return GroupTitleListTile(title: Text(locale.toString())); + } } - yield ListTile( - visualDensity: VisualDensity.compact, - leading: leadingBuilder?.call(locale), - title: Wrap( + return [ + buildTitle(context), + ListTile( + visualDensity: VisualDensity.compact, + leading: leadingBuilder?.call(locale), + title: Wrap( spacing: 12, - children: cs.map((e) => buildContributorCell(context, e)).toList()), - ); + children: cs.map((e) => buildContributorCell(context, e)).toList(), + ), + ), + ]; } return L10nBuilder( @@ -98,7 +107,7 @@ class ContributorTile extends StatelessWidget { children: [ ...buildContributor(context, l10n), for (var locale in contributors.locales) - ...buildTranslation(context, locale, l10n), + ...buildTranslation(context, locale), ], ), ); diff --git a/lib/view/common/donate_dialog.dart b/lib/view/common/donate_dialog.dart index cdd460aa..23fc488a 100644 --- a/lib/view/common/donate_dialog.dart +++ b/lib/view/common/donate_dialog.dart @@ -149,120 +149,110 @@ class _DonateDialogState extends State { } } - Iterable buildBuyMeACoffeeList(BuildContext context) sync* { - if (l10n != null) { - yield ListTile( - title: Text(l10n.donateWay_buyMeACoffee), - contentPadding: EdgeInsets.zero, - visualDensity: VisualDensity.compact, - ); - } - yield BuyMeACoffeeButton( - buyMeACoffeeName: widget.donateBuyMeACoffeeToken, - onLaunchURL: _onLaunchExternelUrl, - onDonation: () => _onDonation(DonateWay.buyMeACoffee), - ); - } - - Iterable buildPaypalList(BuildContext context) sync* { - if (l10n != null) { - yield ListTile( - title: Text(l10n.donateWay_paypal), - contentPadding: EdgeInsets.zero, - visualDensity: VisualDensity.compact, - ); - } - yield PayPalButton( - paypalButtonId: widget.donatePaypalToken, - onLaunchURL: _onLaunchExternelUrl, - onDonation: () => _onDonation(DonateWay.paypal), - ); - } + Iterable buildBuyMeACoffeeList(BuildContext context) => [ + if (l10n != null) + ListTile( + title: Text(l10n.donateWay_buyMeACoffee), + contentPadding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + ), + BuyMeACoffeeButton( + buyMeACoffeeName: widget.donateBuyMeACoffeeToken, + onLaunchURL: _onLaunchExternelUrl, + onDonation: () => _onDonation(DonateWay.buyMeACoffee), + ), + ]; - Iterable buildAlipayList(BuildContext context) sync* { - if (l10n != null) { - yield ListTile( - title: Text(l10n.donateWay_alipay), - contentPadding: EdgeInsets.zero, - visualDensity: VisualDensity.compact, - ); - } - yield Image.asset(widget.alipayQRCodePath, width: 300); - } + Iterable buildPaypalList(BuildContext context) => [ + if (l10n != null) + ListTile( + title: Text(l10n.donateWay_paypal), + contentPadding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + ), + PayPalButton( + paypalButtonId: widget.donatePaypalToken, + onLaunchURL: _onLaunchExternelUrl, + onDonation: () => _onDonation(DonateWay.paypal), + ), + ]; - Iterable buildWechatPayList(BuildContext context) sync* { - if (l10n != null) { - yield ListTile( - title: Text(l10n.donateWay_wechatPay), - contentPadding: EdgeInsets.zero, - visualDensity: VisualDensity.compact, - ); - } - yield Image.asset(widget.wechatPayQRCodePath, width: 300); - } + Iterable buildAlipayList(BuildContext context) => [ + if (l10n != null) + ListTile( + title: Text(l10n.donateWay_alipay), + contentPadding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + ), + Image.asset(widget.alipayQRCodePath, width: 300), + ]; - Iterable buildCrytoButtonList(BuildContext context) sync* { - if (l10n != null) { - yield ListTile( - title: Text(l10n.donateWay_cryptoCurrency), - contentPadding: EdgeInsets.zero, - visualDensity: VisualDensity.compact, - ); - } + Iterable buildWechatPayList(BuildContext context) => [ + if (l10n != null) + ListTile( + title: Text(l10n.donateWay_wechatPay), + contentPadding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + ), + Image.asset(widget.wechatPayQRCodePath, width: 300), + ]; - yield Wrap( - spacing: 8.0, - children: List.generate( - CryptoDonateButtonType.values.length, - (index) { - final t = CryptoDonateButtonType.values[index]; - final addr = getCryptoAddress(t); - return Tooltip( - triggerMode: TooltipTriggerMode.longPress, - message: getCryptoLabel(t, l10n), - child: CryptoDonateButton( - cryptoType: t, - address: addr, - onPressed: addr != '' - ? () => _onCopyCryptoAddressToClipboard(t) - : null, - ), - ); - }, - ), - ); - } + Iterable buildCrytoButtonList(BuildContext context) => [ + if (l10n != null) + ListTile( + title: Text(l10n.donateWay_cryptoCurrency), + contentPadding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + ), + Wrap( + spacing: 8.0, + children: List.generate( + CryptoDonateButtonType.values.length, (index) { + final t = CryptoDonateButtonType.values[index]; + final addr = getCryptoAddress(t); + return Tooltip( + triggerMode: TooltipTriggerMode.longPress, + message: getCryptoLabel(t, l10n), + child: CryptoDonateButton( + cryptoType: t, + address: addr, + onPressed: addr != '' + ? () => _onCopyCryptoAddressToClipboard(t) + : null, + ), + ); + }), + ) + ]; - Iterable buildFirstQRGroup(BuildContext context) sync* { + Iterable buildFirstQRGroup(BuildContext context) { final orientation = MediaQuery.of(context).orientation; switch (orientation) { case Orientation.portrait: - if (donateWays.contains(DonateWay.alipay)) { - yield* buildAlipayList(context); - } - if (donateWays.contains(DonateWay.wechatPay)) { - yield* buildWechatPayList(context); - } - break; + return [ + if (donateWays.contains(DonateWay.alipay)) + ...buildAlipayList(context), + if (donateWays.contains(DonateWay.wechatPay)) + ...buildWechatPayList(context), + ]; case Orientation.landscape: - if (l10n != null) { - yield ListTile( - title: Text(l10n.donateWay_firstQRGroup), - contentPadding: EdgeInsets.zero, - visualDensity: VisualDensity.compact, - ); - yield Row( - mainAxisSize: MainAxisSize.min, - children: [ + return [ + if (l10n != null) + ListTile( + title: Text(l10n.donateWay_firstQRGroup), + contentPadding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + ), + if (l10n != null) + Row(mainAxisSize: MainAxisSize.min, children: [ if (donateWays.contains(DonateWay.alipay)) Image.asset(widget.alipayQRCodePath, height: 300), if (donateWays.contains(DonateWay.wechatPay)) const SizedBox(width: 8.0), if (donateWays.contains(DonateWay.wechatPay)) Image.asset(widget.wechatPayQRCodePath, height: 300), - ], - ); - } + ]), + ]; } } diff --git a/lib/view/common/habit_record_number_picker.dart b/lib/view/common/habit_record_number_picker.dart index 98e8f94a..f6458de8 100644 --- a/lib/view/common/habit_record_number_picker.dart +++ b/lib/view/common/habit_record_number_picker.dart @@ -459,9 +459,9 @@ class _NumberStepButtonState extends State<_NumberStepButton> { @override Widget build(BuildContext context) { return InkWell( - onTap: () => _stopHolding(), + onTap: _stopHolding, onTapDown: (_) => _startHolding(), - onTapCancel: () => _stopHolding(), + onTapCancel: _stopHolding, borderRadius: widget.borderRadius, customBorder: widget.shape, child: widget.child, diff --git a/lib/view/common/habit_record_reason_modifier.dart b/lib/view/common/habit_record_reason_modifier.dart index 64e73871..98419139 100644 --- a/lib/view/common/habit_record_reason_modifier.dart +++ b/lib/view/common/habit_record_reason_modifier.dart @@ -119,8 +119,7 @@ class _HabitRecordReasonModifierDialog height: 56, width: math.min(constraints.maxWidth, dialogMaxWidth), padding: EdgeInsets.zero, - children: - widget.chipTextList.map((e) => buildEmojiChip(e)).toList(), + children: widget.chipTextList.map(buildEmojiChip).toList(), ), TextField( controller: _inputController, diff --git a/lib/view/common/not_found_image.dart b/lib/view/common/not_found_image.dart index 251084ef..6d12494d 100644 --- a/lib/view/common/not_found_image.dart +++ b/lib/view/common/not_found_image.dart @@ -78,8 +78,8 @@ class NotFoundImage extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData theme = Theme.of(context); - TextTheme textTheme = theme.textTheme; + final ThemeData theme = Theme.of(context); + final TextTheme textTheme = theme.textTheme; Widget buildDescChild(BuildContext context) { if (textTheme.headlineSmall != null) { diff --git a/lib/view/common/notification_activated.dart b/lib/view/common/notification_activated.dart index 68a2a2d1..94098eab 100644 --- a/lib/view/common/notification_activated.dart +++ b/lib/view/common/notification_activated.dart @@ -26,7 +26,7 @@ Future showNotificationActivatedDialog({ }) async { return showDialog( context: context, - builder: (BuildContext context) => const NotificationActivatedDialog(), + builder: (context) => const NotificationActivatedDialog(), ); } diff --git a/lib/view/common/notification_pending_requests.dart b/lib/view/common/notification_pending_requests.dart index 2657a0d2..ca43b61f 100644 --- a/lib/view/common/notification_pending_requests.dart +++ b/lib/view/common/notification_pending_requests.dart @@ -24,8 +24,7 @@ Future showNotificationPendingRequestsDialog({ }) async { return showDialog( context: context, - builder: (BuildContext context) => - const NotificationPendingRequestsDialog(), + builder: (context) => const NotificationPendingRequestsDialog(), ); } diff --git a/lib/view/for_app/app_providers.dart b/lib/view/for_app/app_providers.dart index de41af40..4aea8612 100644 --- a/lib/view/for_app/app_providers.dart +++ b/lib/view/for_app/app_providers.dart @@ -35,27 +35,29 @@ import '../../reminders/notification_channel.dart'; class AppProviders extends SingleChildStatelessWidget { const AppProviders({super.key, super.child}); - Iterable _buildHabitExportModel() sync* { - yield ChangeNotifierProvider( - create: (context) => HabitFileExporterViewModel(), - ); - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) => previous!..updateDBHelper(value), - ); - } + Iterable _buildHabitExportModel() => [ + ChangeNotifierProvider( + create: (context) => HabitFileExporterViewModel(), + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) => + previous!..updateDBHelper(value), + ), + ]; - Iterable _buildHabitImportModel() sync* { - yield ChangeNotifierProvider( - create: (context) => HabitFileImporterViewModel(), - ); - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) => previous!..updateDBHelper(value), - ); - } + Iterable _buildHabitImportModel() => [ + ChangeNotifierProvider( + create: (context) => HabitFileImporterViewModel(), + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) => + previous!..updateDBHelper(value), + ), + ]; @override Widget buildWithChild(BuildContext context, Widget? child) => MultiProvider( diff --git a/lib/view/for_app_about/page_providers.dart b/lib/view/for_app_about/page_providers.dart index 88b3c508..8134a02f 100644 --- a/lib/view/for_app_about/page_providers.dart +++ b/lib/view/for_app_about/page_providers.dart @@ -26,8 +26,8 @@ class PageProviders extends SingleChildStatelessWidget { const PageProviders({super.key, super.child}); Future loadAboutInfoData() async { - String rawJson = await rootBundle.loadString(aboutInfoFilePath); - Map data = jsonDecode(rawJson); + final String rawJson = await rootBundle.loadString(aboutInfoFilePath); + final Map data = jsonDecode(rawJson); return AboutInfo.fromJson(data); } diff --git a/lib/view/for_app_setting/app_setting_calbar_occupy_tile.dart b/lib/view/for_app_setting/app_setting_calbar_occupy_tile.dart index 1996c8d5..24d9c99a 100644 --- a/lib/view/for_app_setting/app_setting_calbar_occupy_tile.dart +++ b/lib/view/for_app_setting/app_setting_calbar_occupy_tile.dart @@ -67,7 +67,7 @@ class AppSettingCalbarOccupyTile extends StatelessWidget { min: lessPercentage.toDouble(), divisions: (morePercentage - lessPercentage) ~/ splitLen, label: _getLabel(l10n), - onChanged: (double value) { + onChanged: (value) { onSelectionChanged(value.toInt()); }, ), diff --git a/lib/view/for_app_setting/app_setting_display_op_tile.dart b/lib/view/for_app_setting/app_setting_display_op_tile.dart index e76e02b9..82d0b000 100644 --- a/lib/view/for_app_setting/app_setting_display_op_tile.dart +++ b/lib/view/for_app_setting/app_setting_display_op_tile.dart @@ -65,21 +65,22 @@ class AppSettingDisplayRecordOperationTile extends StatelessWidget { Widget build(BuildContext context) { Widget buildSegmentedTile(BuildContext context, [L10n? l10n]) { final selected = {inputAction}; - getMaxLine(action) => selected.contains(action) ? null : 1; - getOverflow(action) => selected.contains(action) - ? TextOverflow.visible - : TextOverflow.ellipsis; - getButtonSegment(UserAction action) => ButtonSegment( + + ButtonSegment getButtonSegment(UserAction action) => + ButtonSegment( value: action, icon: _getActionIcon(action), label: l10n != null ? Text( _getActionText(action, l10n) ?? '', - overflow: getOverflow(action), - maxLines: getMaxLine(action), + overflow: selected.contains(action) + ? TextOverflow.visible + : TextOverflow.ellipsis, + maxLines: selected.contains(action) ? null : 1, ) : null, ); + return SegmentedButton( segments: >[ getButtonSegment(UserAction.tap), diff --git a/lib/view/for_app_setting/import_habits_confirm.dart b/lib/view/for_app_setting/import_habits_confirm.dart index 1057c543..86fe29eb 100644 --- a/lib/view/for_app_setting/import_habits_confirm.dart +++ b/lib/view/for_app_setting/import_habits_confirm.dart @@ -78,7 +78,7 @@ class _AppSettingImportHabitsConfirmDialog void _onConfirmButtonPressed() { if (!mounted || _confirmed) return; - var dataImporter = context.read(); + final dataImporter = context.read(); if (!dataImporter.mounted) return; final result = dataImporter.importHabitsData( widget.data, @@ -89,9 +89,7 @@ class _AppSettingImportHabitsConfirmDialog Navigator.of(context).maybePop(); return; } - setState(() { - confirmed(); - }); + setState(confirmed); } @override diff --git a/lib/view/for_habit_detail/_mixin.dart b/lib/view/for_habit_detail/_mixin.dart index 76518ef7..6f78bba5 100644 --- a/lib/view/for_habit_detail/_mixin.dart +++ b/lib/view/for_habit_detail/_mixin.dart @@ -24,9 +24,9 @@ import '../../theme/color.dart'; mixin HabitHeatmapColorChooseMixin on State { Map buildHeatmapColorMap(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); - var viewmodel = context.read(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); + final viewmodel = context.read(); return { HabitHeatMapColorMapDefine.uncomplate: (colorData?.getColor(viewmodel.habitColorType!) ?? @@ -51,9 +51,9 @@ mixin HabitHeatmapColorChooseMixin on State { } Map buildHeatmapValueColorMap(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); - var viewmodel = context.read(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); + final viewmodel = context.read(); return { HabitHeatMapColorMapDefine.uncomplate: colorData?.getColor(viewmodel.habitColorType!) ?? diff --git a/lib/view/for_habit_detail/habit_detail_appbar.dart b/lib/view/for_habit_detail/habit_detail_appbar.dart index 1c647512..7f411a46 100644 --- a/lib/view/for_habit_detail/habit_detail_appbar.dart +++ b/lib/view/for_habit_detail/habit_detail_appbar.dart @@ -33,8 +33,8 @@ class HabitDetailAppBar extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); final color = colorType != null ? colorData?.getColor(colorType!) : null; final titleFont = themeData.textTheme.titleLarge; diff --git a/lib/view/for_habit_detail/habit_detail_chart_title.dart b/lib/view/for_habit_detail/habit_detail_chart_title.dart index 918c379a..c10128b9 100644 --- a/lib/view/for_habit_detail/habit_detail_chart_title.dart +++ b/lib/view/for_habit_detail/habit_detail_chart_title.dart @@ -26,8 +26,8 @@ class HabitDetailChartTitle extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - TextTheme textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/view/for_habit_detail/habit_detail_fab.dart b/lib/view/for_habit_detail/habit_detail_fab.dart index 01b8975e..9316858d 100644 --- a/lib/view/for_habit_detail/habit_detail_fab.dart +++ b/lib/view/for_habit_detail/habit_detail_fab.dart @@ -26,8 +26,8 @@ class HabitDetailFAB extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); Color? backgroundColor = themeData.colorScheme.secondaryContainer; Color? iconColor = themeData.colorScheme.onSecondaryContainer; diff --git a/lib/view/for_habit_detail/habit_detail_freq_chart.dart b/lib/view/for_habit_detail/habit_detail_freq_chart.dart index 2bbb8542..5b914303 100644 --- a/lib/view/for_habit_detail/habit_detail_freq_chart.dart +++ b/lib/view/for_habit_detail/habit_detail_freq_chart.dart @@ -66,7 +66,7 @@ class _HabitDetailFreqChartTitle extends StatelessWidget { initialValue: chartCombine, onSelected: onPopMenuSelected, itemBuilder: (context) { - var result = >[ + final result = >[ CheckedPopupMenuItem( padding: const EdgeInsets.symmetric(horizontal: 1.0), checked: chartCombine == HabitDetailFreqChartCombine.weekly, @@ -125,7 +125,7 @@ class _HabitDetailFreqChartSubTitle extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); + final ThemeData themeData = Theme.of(context); // NOTE: fl_chart isn't support rtl layout direction yet // more info see: https://github.com/imaNNeo/fl_chart/issues/129 @@ -425,15 +425,15 @@ class HabitDetailFreqChart extends StatelessWidget { final double textScaleFactor = math.min(MediaQuery.textScaleFactorOf(context), 1.3); - var eachSize = this.eachSize * textScaleFactor; - var limit = math.max(1, allowWidth ~/ math.max(eachSize, cellWidth)); - var firstDate = getFirstDate(limit); - var lastDate = getLastDate(limit); - var titleHeight = this.titleHeight * math.max(1.0, textScaleFactor); + final eachSize = this.eachSize * textScaleFactor; + final limit = math.max(1, allowWidth ~/ math.max(eachSize, cellWidth)); + final firstDate = getFirstDate(limit); + final lastDate = getLastDate(limit); + final titleHeight = this.titleHeight * math.max(1.0, textScaleFactor); - var isToday = offset == 0; - var isLast = lastDate.isBefore(habitStartDate); - var data = getData(firstDate, lastDate, limit); + final isToday = offset == 0; + final isLast = lastDate.isBefore(habitStartDate); + final data = getData(firstDate, lastDate, limit); if (isLargeScreen) { return Padding( padding: padding, diff --git a/lib/view/for_habit_detail/habit_detail_loading_indicator.dart b/lib/view/for_habit_detail/habit_detail_loading_indicator.dart index 27baadf2..d0ab880c 100644 --- a/lib/view/for_habit_detail/habit_detail_loading_indicator.dart +++ b/lib/view/for_habit_detail/habit_detail_loading_indicator.dart @@ -30,8 +30,8 @@ class HabitDetailLoadingIndicator extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); return Center( child: SizedBox( width: size.width, diff --git a/lib/view/for_habit_detail/habit_detail_score_chart.dart b/lib/view/for_habit_detail/habit_detail_score_chart.dart index 02f23b76..63d51066 100644 --- a/lib/view/for_habit_detail/habit_detail_score_chart.dart +++ b/lib/view/for_habit_detail/habit_detail_score_chart.dart @@ -155,7 +155,7 @@ class HabitDetailScoreChart extends StatelessWidget { var lastDate = getLastDate(limit); lastDate = lastDate.isBefore(startDate) ? lastDate : startDate; - var chartKey = ValueKey("scoreChart" + final chartKey = ValueKey("scoreChart" "|${firstDate.year}-${firstDate.month}-${firstDate.day}" "|${lastDate.year}-${lastDate.month}-${lastDate.day}" "|${chartCombine.index}"); diff --git a/lib/view/for_habit_detail/habit_detail_summary_tile.dart b/lib/view/for_habit_detail/habit_detail_summary_tile.dart index d3b5b0a1..541b640a 100644 --- a/lib/view/for_habit_detail/habit_detail_summary_tile.dart +++ b/lib/view/for_habit_detail/habit_detail_summary_tile.dart @@ -40,8 +40,8 @@ class HabitDetailSummaryTile extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); return ListTile( leading: Padding( diff --git a/lib/view/for_habit_detail/habit_edit_repl_rcd_cal.dart b/lib/view/for_habit_detail/habit_edit_repl_rcd_cal.dart index 7f6a8ebb..313f3f5a 100644 --- a/lib/view/for_habit_detail/habit_edit_repl_rcd_cal.dart +++ b/lib/view/for_habit_detail/habit_edit_repl_rcd_cal.dart @@ -83,7 +83,7 @@ class _HabitEditReplacementRecordCalendarDialog void onHeatmapCellPressed(DateTime date, num? value) async { if (!mounted) return; - var viewmodel = context.read(); + final viewmodel = context.read(); if (!viewmodel.mounted) return; await viewmodel.changeRecordStatus(HabitDate.dateTime(date)); } @@ -144,7 +144,7 @@ class _HabitEditReplacementRecordCalendarDialog if (!viewmodel.mounted || viewmodel.habitDetailData == null) return; final record = viewmodel.getHabitRecordData(date); - num orgNum = record?.value ?? -1; + final num orgNum = record?.value ?? -1; if (record != null && record.status == HabitRecordStatus.done) { form = HabitDailyRecordForm.getImp( type: viewmodel.habitType!, @@ -214,9 +214,8 @@ class _HabitEditReplacementRecordCalendarDialog showCellText: true, ), callbackModel: HeatmapCallbackModel( - onCellPressed: (date, value) => onHeatmapCellPressed(date, value), - onCellLongPressed: (date, value) => - onHeatmapCellLongPressed(date, value), + onCellPressed: onHeatmapCellPressed, + onCellLongPressed: onHeatmapCellLongPressed, ), weekLabelValueBuilder: (context, protoDate, defaultFormat) { return FittedBox( @@ -254,7 +253,7 @@ class _HabitEditReplacementRecordCalendarDialog Widget? valueWidget; if (dateDay == null) return null; if (_showDailyGoalValue) { - var value = status.value ?? 0; + final value = status.value ?? 0; switch (status.status) { case HabitRecordStatus.done: valueWidget = FittedBox( diff --git a/lib/view/for_habit_detail/habit_heatmap.dart b/lib/view/for_habit_detail/habit_heatmap.dart index 987e89d5..ad0210c6 100644 --- a/lib/view/for_habit_detail/habit_heatmap.dart +++ b/lib/view/for_habit_detail/habit_heatmap.dart @@ -74,10 +74,10 @@ class HabitHeatmap extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - TextTheme textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; - var heatmap = HeatmapCalendar( + final heatmap = HeatmapCalendar( firstDay: firstday, startDate: startDate, endedDate: endedDate, diff --git a/lib/view/for_habit_detail/habit_other_info_tile.dart b/lib/view/for_habit_detail/habit_other_info_tile.dart index 9a0b1fc4..8bcd5319 100644 --- a/lib/view/for_habit_detail/habit_other_info_tile.dart +++ b/lib/view/for_habit_detail/habit_other_info_tile.dart @@ -30,8 +30,8 @@ class HabitOtherInfoTile extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - TextTheme textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; Widget? titleWidget = title, subtitleWidget = subTitle; if (title != null && textTheme.bodySmall != null) { diff --git a/lib/view/for_habit_detail/page_providers.dart b/lib/view/for_habit_detail/page_providers.dart index 42924a17..11f9430a 100644 --- a/lib/view/for_habit_detail/page_providers.dart +++ b/lib/view/for_habit_detail/page_providers.dart @@ -26,37 +26,34 @@ import '../../reminders/notification_channel.dart'; class PageProviders extends SingleChildStatelessWidget { const PageProviders({super.key, super.child}); - Iterable _buildPageViewModel() sync* { - yield ChangeNotifierProvider( - create: (context) => HabitDetailViewModel(), - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) => previous!..updateDBHelper(value), - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) { - if (value.firstDay != previous!.firstday) { - previous.updateFirstday(value.firstDay); - WidgetsBinding.instance.addPostFrameCallback((_) { - previous.rockreloadDBToggleSwich(); - }); - } - return previous; - }, - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) => - previous!..setNotificationChannelData(value), - ); - } + Iterable _buildPageViewModel() => [ + ChangeNotifierProvider( + create: (context) => HabitDetailViewModel(), + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) => + previous!..updateDBHelper(value), + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) { + if (value.firstDay != previous!.firstday) { + previous.updateFirstday(value.firstDay); + WidgetsBinding.instance.addPostFrameCallback((_) { + previous.rockreloadDBToggleSwich(); + }); + } + return previous; + }, + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) => + previous!..setNotificationChannelData(value), + ), + ]; @override Widget buildWithChild(BuildContext context, Widget? child) => MultiProvider( diff --git a/lib/view/for_habit_edit/habit_color_picker.dart b/lib/view/for_habit_edit/habit_color_picker.dart index 93a48f0f..a7f4f804 100644 --- a/lib/view/for_habit_edit/habit_color_picker.dart +++ b/lib/view/for_habit_edit/habit_color_picker.dart @@ -56,8 +56,9 @@ class HabitColorPickerDialog extends StatelessWidget { ), ), itemBuilder: (color, isCurrentColor, changeColor) { - HabitColorType? colorType = colorData?.getHabitColorTypeByCC(color); - Color? onColor = colorData?.getOnColor(colorType!); + final HabitColorType? colorType = + colorData?.getHabitColorTypeByCC(color); + final Color? onColor = colorData?.getOnColor(colorType!); return IconButton( onPressed: changeColor, icon: isCurrentColor ? const Icon(Icons.check) : const Icon(null), diff --git a/lib/view/for_habit_edit/habit_date_picker.dart b/lib/view/for_habit_edit/habit_date_picker.dart index ecc96b76..ef639442 100644 --- a/lib/view/for_habit_edit/habit_date_picker.dart +++ b/lib/view/for_habit_edit/habit_date_picker.dart @@ -44,9 +44,9 @@ class HabitDatePickerDialog extends StatefulWidget { class _HabitDatePickerDialogView extends State { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - CustomColors? colorData = themeData.extension(); - DateTime now = DateTime.now(); + final ThemeData themeData = Theme.of(context); + final CustomColors? colorData = themeData.extension(); + final DateTime now = DateTime.now(); return Theme( data: themeData.copyWith( colorScheme: themeData.colorScheme.copyWith( diff --git a/lib/view/for_habit_edit/habit_frequency_picker.dart b/lib/view/for_habit_edit/habit_frequency_picker.dart index 076cc3b7..3e95a5f1 100644 --- a/lib/view/for_habit_edit/habit_frequency_picker.dart +++ b/lib/view/for_habit_edit/habit_frequency_picker.dart @@ -61,7 +61,7 @@ class _HabitFrequencyPickerDialogView @override void initState() { super.initState(); - var pickerType = getFrequencyPickerType(widget.frequency); + final pickerType = getFrequencyPickerType(widget.frequency); selectFrequencyType = pickerType; _preweekInputController = TextEditingController() ..text = defaultFrequencyPreWeekFreq.toString(); diff --git a/lib/view/for_habit_edit/habit_reminder_tiles.dart b/lib/view/for_habit_edit/habit_reminder_tiles.dart index a7e38351..93df52bf 100644 --- a/lib/view/for_habit_edit/habit_reminder_tiles.dart +++ b/lib/view/for_habit_edit/habit_reminder_tiles.dart @@ -98,9 +98,9 @@ class _HabitReminderTiles extends State { } Widget buildReminderQuestTile(BuildContext context) { - ThemeData? themeData = Theme.of(context); - ColorScheme? colorScheme = themeData.colorScheme; - TextTheme? textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final ColorScheme colorScheme = themeData.colorScheme; + final TextTheme textTheme = themeData.textTheme; return ListTile( leading: const SizedBox(), title: TextField( @@ -124,13 +124,13 @@ class _HabitReminderTiles extends State { return Column( mainAxisSize: MainAxisSize.min, children: [ - Builder(builder: (context) => buildReminderTimeTile(context)), + Builder(builder: buildReminderTimeTile), ExpandedSection( expand: widget.reminder != null, child: Column( children: [ - Builder(builder: (context) => buildReminderTypeTile(context)), - Builder(builder: (context) => buildReminderQuestTile(context)), + Builder(builder: buildReminderTypeTile), + Builder(builder: buildReminderQuestTile), ], ), ), diff --git a/lib/view/for_habits_display/habit_display_empty_image.dart b/lib/view/for_habits_display/habit_display_empty_image.dart index 46a6049c..a22af354 100644 --- a/lib/view/for_habits_display/habit_display_empty_image.dart +++ b/lib/view/for_habits_display/habit_display_empty_image.dart @@ -87,8 +87,8 @@ class HabitDisplayEmptyImage extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData theme = Theme.of(context); - TextTheme textTheme = theme.textTheme; + final ThemeData theme = Theme.of(context); + final TextTheme textTheme = theme.textTheme; Widget buildDescChild(BuildContext context) { if (textTheme.headlineSmall != null) { diff --git a/lib/view/for_habits_display/habit_display_fab.dart b/lib/view/for_habits_display/habit_display_fab.dart index 561d6689..a4e90bce 100644 --- a/lib/view/for_habits_display/habit_display_fab.dart +++ b/lib/view/for_habits_display/habit_display_fab.dart @@ -34,7 +34,7 @@ class HabitDisplayFAB extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); + final ThemeData themeData = Theme.of(context); return OpenContainer( transitionDuration: const Duration(milliseconds: 250), diff --git a/lib/view/for_habits_display/habit_display_list_tile.dart b/lib/view/for_habits_display/habit_display_list_tile.dart index f4e7a81b..9e18eabe 100644 --- a/lib/view/for_habits_display/habit_display_list_tile.dart +++ b/lib/view/for_habits_display/habit_display_list_tile.dart @@ -114,8 +114,8 @@ class HabitDisplayListTile extends StatelessWidget { data: getThemeData(Theme.of(context)), child: Builder( builder: (context) { - ThemeData themeData = Theme.of(context); - var bgcolor = themeData.colorScheme.onSurfaceOpacity08; + final ThemeData themeData = Theme.of(context); + final bgcolor = themeData.colorScheme.onSurfaceOpacity08; return InkWell( onTap: onHabitSummaryDataPressed != null ? () => onHabitSummaryDataPressed!(data.uuid) diff --git a/lib/view/for_habits_display/habit_display_main_menu.dart b/lib/view/for_habits_display/habit_display_main_menu.dart index 6f2875f9..83711241 100644 --- a/lib/view/for_habits_display/habit_display_main_menu.dart +++ b/lib/view/for_habits_display/habit_display_main_menu.dart @@ -219,7 +219,7 @@ class _HabitsDisplayFilterListView extends StatelessWidget { HabitsDisplayFilter.allFalse, value: habitsDisplayFilter.allowArchivedHabits, onChanged: (value) { - var newFilter = + final newFilter = habitsDisplayFilter.copyWith(allowArchivedHabits: value); if (newFilter != HabitsDisplayFilter.allFalse) { onFetchNewDisplayFilter?.call(newFilter); @@ -235,7 +235,7 @@ class _HabitsDisplayFilterListView extends StatelessWidget { HabitsDisplayFilter.allFalse, value: habitsDisplayFilter.allowInProgressHabits, onChanged: (value) { - var newFilter = + final newFilter = habitsDisplayFilter.copyWith(allowInProgressHabits: value); if (newFilter != HabitsDisplayFilter.allFalse) { onFetchNewDisplayFilter?.call(newFilter); @@ -251,7 +251,7 @@ class _HabitsDisplayFilterListView extends StatelessWidget { HabitsDisplayFilter.allFalse, value: habitsDisplayFilter.allowCompleteHabits, onChanged: (value) { - var newFilter = + final newFilter = habitsDisplayFilter.copyWith(allowCompleteHabits: value); if (newFilter != HabitsDisplayFilter.allFalse) { onFetchNewDisplayFilter?.call(newFilter); diff --git a/lib/view/for_habits_display/habit_display_sort_type_picker.dart b/lib/view/for_habits_display/habit_display_sort_type_picker.dart index 6f95d018..fba19aca 100644 --- a/lib/view/for_habits_display/habit_display_sort_type_picker.dart +++ b/lib/view/for_habits_display/habit_display_sort_type_picker.dart @@ -76,16 +76,15 @@ class _HabitDisplaySortTypePickerDialog @override Widget build(BuildContext context) { - Iterable buildSortTypeRadioListTiles(BuildContext context) sync* { - for (var sortType in HabitDisplaySortType.menuOrderedList) { - yield _SortTypeRadioListTile( - sortType: sortType, - sortDirection: crtShowDirecitonWithDefault, - crtSortType: crtSortType, - onChanged: _onRadioTapChanged, + Iterable buildSortTypeRadioListTiles(BuildContext context) => + HabitDisplaySortType.menuOrderedList.map( + (sortType) => _SortTypeRadioListTile( + sortType: sortType, + sortDirection: crtShowDirecitonWithDefault, + crtSortType: crtSortType, + onChanged: _onRadioTapChanged, + ), ); - } - } return AlertDialog( scrollable: true, @@ -110,7 +109,7 @@ class _HabitDisplaySortTypePickerDialog enabled: crtSortType != HabitDisplaySortType.manual, controlAffinity: ListTileControlAffinity.leading, onChanged: (value) { - var newSortDirection = value == true + final newSortDirection = value == true ? HabitDisplaySortDirection.desc : HabitDisplaySortDirection.asc; setState(() { diff --git a/lib/view/for_habits_display/habit_display_stats_menu.dart b/lib/view/for_habits_display/habit_display_stats_menu.dart index 8ccec309..d7af0959 100644 --- a/lib/view/for_habits_display/habit_display_stats_menu.dart +++ b/lib/view/for_habits_display/habit_display_stats_menu.dart @@ -116,10 +116,10 @@ class HabitDisplayStatsMenuDialog extends StatelessWidget { var crtIndex = 0; for (var sd in statisticsData.currentPopularityData) { if (crtIndex > 2) break; - var habit = viewmodel.getHabit(sd.uuid); + final habit = viewmodel.getHabit(sd.uuid); if (habit == null) continue; - var changed = sd.getLast30DaysChanged(now); - var symbol = changed > 0 + final changed = sd.getLast30DaysChanged(now); + final symbol = changed > 0 ? "+" : changed < 0 ? "-" diff --git a/lib/view/for_habits_display/habit_summary_list_tile.dart b/lib/view/for_habits_display/habit_summary_list_tile.dart index fb0ea920..4160d998 100644 --- a/lib/view/for_habits_display/habit_summary_list_tile.dart +++ b/lib/view/for_habits_display/habit_summary_list_tile.dart @@ -145,10 +145,10 @@ class _HabitSummaryListTile extends State { Widget? _buildCellItem( BuildContext context, int index, double realHeight, DateTime crtDate) { - var showDate = + final showDate = HabitRecordDate.dateTime(crtDate.subtract(Duration(days: index))); - var record = data.getRecordByDate(showDate); - var isAutoComplated = data.isRecordAutoComplated(showDate); + final record = data.getRecordByDate(showDate); + final isAutoComplated = data.isRecordAutoComplated(showDate); return ConstrainedBox( constraints: BoxConstraints.tightFor(width: realHeight), @@ -186,16 +186,16 @@ class _HabitSummaryListTile extends State { @override Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - HabitSummaryListTileColor? themeColor = + final ThemeData themeData = Theme.of(context); + final HabitSummaryListTileColor? themeColor = themeData.extension(); - HabitSummaryListTileColor defaultThemeColor = + final HabitSummaryListTileColor defaultThemeColor = _getDefaultListTileColor(themeData); - TextTheme? textTheme = themeData.textTheme; + final TextTheme textTheme = themeData.textTheme; final double textScaleFactor = getTextScaleFactor(context); - DateTime crtDate = widget.startDate ?? DateTime.now(); + final DateTime crtDate = widget.startDate ?? DateTime.now(); int? limitItemCount; limitItemCount = widget.endDate == null @@ -261,7 +261,7 @@ class _HabitSummaryListTile extends State { } HabitSummaryListTileColor _getDefaultListTileColor(ThemeData themeData) { - CustomColors? colorData = themeData.extension(); + final CustomColors? colorData = themeData.extension(); return HabitSummaryListTileColor( titleColor: colorData?.getColor(data.colorType), progressCircleColor: colorData?.getColor(data.colorType), diff --git a/lib/view/for_habits_display/page_providers.dart b/lib/view/for_habits_display/page_providers.dart index f027f120..19f96242 100644 --- a/lib/view/for_habits_display/page_providers.dart +++ b/lib/view/for_habits_display/page_providers.dart @@ -30,68 +30,64 @@ import '../../reminders/notification_channel.dart'; class PageProviders extends SingleChildStatelessWidget { const PageProviders({super.key, super.child}); - Iterable _buildPageViewModel() sync* { - yield ChangeNotifierProvider( - create: (context) => HabitSummaryViewModel( - verticalScrollController: ScrollController(), - horizonalScrollControllerGroup: LinkedScrollControllerGroup(), - ), - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) => previous!..updateDBHelper(value), - ); - - yield ChangeNotifierProxyProvider2( - create: (context) => context.read(), - update: (context, sortOptions, habitDisplayFilter, previous) { - previous! - .updateSortOptions(sortOptions.sortType, sortOptions.sortDirection); - previous - .updateHabitDisplayFilter(habitDisplayFilter.habitsDisplayFilter); - WidgetsBinding.instance.addPostFrameCallback((_) { - previous.resortData(); - }); - return previous; - }, - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) { - if (value.consumeReloadDisplayFlag()) { - WidgetsBinding.instance.addPostFrameCallback((_) { - previous!.rockreloadDBToggleSwich(); - }); - } - return previous!; - }, - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) { - if (value.firstDay != previous!.firstday) { - previous.updateFirstday(value.firstDay); - WidgetsBinding.instance.addPostFrameCallback((_) { - previous.rockreloadDBToggleSwich(); - }); - } - return previous; - }, - ); - - yield ChangeNotifierProxyProvider( - create: (context) => context.read(), - update: (context, value, previous) => - previous!..setNotificationChannelData(value), - ); - } + Iterable _buildPageViewModel() => [ + ChangeNotifierProvider( + create: (context) => HabitSummaryViewModel( + verticalScrollController: ScrollController(), + horizonalScrollControllerGroup: LinkedScrollControllerGroup(), + ), + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) => + previous!..updateDBHelper(value), + ), + ChangeNotifierProxyProvider2( + create: (context) => context.read(), + update: (context, sortOptions, habitDisplayFilter, previous) { + previous!.updateSortOptions( + sortOptions.sortType, sortOptions.sortDirection); + previous.updateHabitDisplayFilter( + habitDisplayFilter.habitsDisplayFilter); + WidgetsBinding.instance.addPostFrameCallback((_) { + previous.resortData(); + }); + return previous; + }, + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) { + if (value.consumeReloadDisplayFlag()) { + WidgetsBinding.instance.addPostFrameCallback((_) { + previous!.rockreloadDBToggleSwich(); + }); + } + return previous!; + }, + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) { + if (value.firstDay != previous!.firstday) { + previous.updateFirstday(value.firstDay); + WidgetsBinding.instance.addPostFrameCallback((_) { + previous.rockreloadDBToggleSwich(); + }); + } + return previous; + }, + ), + ChangeNotifierProxyProvider( + create: (context) => context.read(), + update: (context, value, previous) => + previous!..setNotificationChannelData(value), + ), + ]; @override Widget buildWithChild(BuildContext context, Widget? child) => MultiProvider( diff --git a/lib/view/for_habits_display/sliver_calendar_bar.dart b/lib/view/for_habits_display/sliver_calendar_bar.dart index 413e4812..86646b8d 100644 --- a/lib/view/for_habits_display/sliver_calendar_bar.dart +++ b/lib/view/for_habits_display/sliver_calendar_bar.dart @@ -83,7 +83,7 @@ class _SliverCalendarBar extends State { @override Widget build(BuildContext context) { - Widget? expandIcon = widget.onLeftBtnPressed != null + final Widget? expandIcon = widget.onLeftBtnPressed != null ? _SliverClanedarBarExpandButton( onPressed: widget.onLeftBtnPressed, isExpanded: widget.isExtended, diff --git a/lib/view/page_app_about.dart b/lib/view/page_app_about.dart index 3cfcf667..8ffa0ff6 100644 --- a/lib/view/page_app_about.dart +++ b/lib/view/page_app_about.dart @@ -118,9 +118,9 @@ class _AppAboutView extends State { ), body: ListView( children: [ - const AppAboutVersionTile( + AppAboutVersionTile( isMonoLogo: true, - logoPath: "assets/logo/icon-momo.svg", + logoPath: Assets.logo.iconMomo.path, changeLogPath: "CHANGELOG.md", ), const AppAboutSourceCodeTile(), diff --git a/lib/view/page_app_setting.dart b/lib/view/page_app_setting.dart index 3787b9dd..65cf90f3 100644 --- a/lib/view/page_app_setting.dart +++ b/lib/view/page_app_setting.dart @@ -223,7 +223,7 @@ class _AppSettingView extends State } void _onImportAllTilePressed() async { - FilePickerResult? result; + final FilePickerResult? result; if (!mounted) return; try { result = await FilePicker.platform.pickFiles(); @@ -331,7 +331,7 @@ class _AppSettingView extends State void _onExportDBTilePressed(BuildContext context) async { if (!mounted) return; - String dbPath = path.join(await getDatabasesPath(), appDBName); + final dbPath = path.join(await getDatabasesPath(), appDBName); if (!mounted) return; shareXFiles([XFile(dbPath)], context: context); } @@ -386,259 +386,263 @@ class _AppSettingView extends State @override Widget build(BuildContext context) { - Iterable buildDisplaySubGroup(BuildContext context) sync* { - yield GroupTitleListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_displaySubgroupText) - : const Text("Display"), - ), - ); - yield Selector( - selector: (context, vm) => vm.firstDay, - shouldRebuild: (previous, next) => previous != next, - builder: (context, firstDay, child) => AppSettingFirstDayTile( - firstDay: firstDay, - onPressed: () => _openAppFirtDaySelectDialog(context), - ), - ); - yield Selector( - selector: (context, vm) => vm.config, - shouldRebuild: (previous, next) => true, - builder: (context, config, child) => - AppSettingDateDisplayFormatListTile( - config: config, - onPressed: () => _openCustomDateTimeFormatPickerDialog(context), - ), - ); - yield Selector( - selector: (context, vm) => vm.displayPageOccupyPrt, - shouldRebuild: (previous, next) => previous != next, - builder: (context, occupyPrt, child) => AppSettingCalbarOccupyTile( - currentPercentage: occupyPrt, - lessPercentage: normalizeAppCalendarBarOccupyPrt( - appCalendarBarDefualtOccupyPrt - 20), - morePercentage: normalizeAppCalendarBarOccupyPrt( - appCalendarBarDefualtOccupyPrt + 20), - normalPercentage: appCalendarBarDefualtOccupyPrt, - onSelectionChanged: (int value) { - context.read().setNewDisplayPageOccupyPrt(value); - }, - ), - ); - yield Selector( - selector: (context, vm) => vm.flag, - shouldRebuild: (previous, next) => previous != next, - builder: (context, flag, child) => L10nBuilder( - builder: (context, l10n) => SwitchListTile( - title: l10n != null - ? Text(l10n.appSetting_compactUISwitcher_titleText) - : const Text("Drag calendar by page"), - subtitle: l10n != null - ? Text(l10n.appSetting_compactUISwitcher_subtitleText) - : null, - onChanged: _onCompactTileChanged, - value: flag, + Iterable buildDisplaySubGroup(BuildContext context) => [ + GroupTitleListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_displaySubgroupText) + : const Text("Display"), + ), ), - ), - ); - } - - Iterable buildOperationSubGroup(BuildContext context) sync* { - yield GroupTitleListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_operationSubgroupText) - : const Text("Operation"), - ), - ); - yield Selector( - selector: (context, vm) => vm.scrollBehavior, - shouldRebuild: (previous, next) => previous != next, - builder: (context, scrollBehavior, child) => L10nBuilder( - builder: (context, l10n) => SwitchListTile( - title: l10n != null - ? Text(l10n.appSetting_dragCalendarByPageTile_titleText) - : const Text("Drag calendar by page"), - subtitle: l10n != null - ? Text(l10n.appSetting_dragCalendarByPageTile_subtitleText) - : null, - onChanged: _onDrageCalendarByPageTileChanged, - value: scrollBehavior == HabitsRecordScrollBehavior.page, + Selector( + selector: (context, vm) => vm.firstDay, + shouldRebuild: (previous, next) => previous != next, + builder: (context, firstDay, child) => AppSettingFirstDayTile( + firstDay: firstDay, + onPressed: () => _openAppFirtDaySelectDialog(context), + ), ), - ), - ); - yield Selector( - selector: (context, vm) => vm.changeRecordStatus, - shouldRebuild: (previous, next) => previous != next, - builder: (context, value, child) => L10nBuilder( - builder: (context, l10n) => LayoutBuilder( - builder: (context, constraints) => - AppSettingDisplayRecordOperationTile( - isLargeScreen: - constraints.maxWidth >= kHabitLargeScreenAdaptWidth, - inputAction: value, + Selector( + selector: (context, vm) => vm.config, + shouldRebuild: (previous, next) => true, + builder: (context, config, child) => + AppSettingDateDisplayFormatListTile( + config: config, + onPressed: () => _openCustomDateTimeFormatPickerDialog(context), + ), + ), + Selector( + selector: (context, vm) => vm.displayPageOccupyPrt, + shouldRebuild: (previous, next) => previous != next, + builder: (context, occupyPrt, child) => AppSettingCalbarOccupyTile( + currentPercentage: occupyPrt, + lessPercentage: normalizeAppCalendarBarOccupyPrt( + appCalendarBarDefualtOccupyPrt - 20), + morePercentage: normalizeAppCalendarBarOccupyPrt( + appCalendarBarDefualtOccupyPrt + 20), + normalPercentage: appCalendarBarDefualtOccupyPrt, + onSelectionChanged: (value) { + context + .read() + .setNewDisplayPageOccupyPrt(value); + }, + ), + ), + Selector( + selector: (context, vm) => vm.flag, + shouldRebuild: (previous, next) => previous != next, + builder: (context, flag, child) => L10nBuilder( + builder: (context, l10n) => SwitchListTile( + title: l10n != null + ? Text(l10n.appSetting_compactUISwitcher_titleText) + : const Text("Drag calendar by page"), + subtitle: l10n != null + ? Text(l10n.appSetting_compactUISwitcher_subtitleText) + : null, + onChanged: _onCompactTileChanged, + value: flag, + ), + ), + ), + ]; + + Iterable buildOperationSubGroup(BuildContext context) => [ + GroupTitleListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_operationSubgroupText) + : const Text("Operation"), + ), + ), + Selector( + selector: (context, vm) => vm.scrollBehavior, + shouldRebuild: (previous, next) => previous != next, + builder: (context, scrollBehavior, child) => L10nBuilder( + builder: (context, l10n) => SwitchListTile( + title: l10n != null + ? Text(l10n.appSetting_dragCalendarByPageTile_titleText) + : const Text("Drag calendar by page"), + subtitle: l10n != null + ? Text(l10n.appSetting_dragCalendarByPageTile_subtitleText) + : null, + onChanged: _onDrageCalendarByPageTileChanged, + value: scrollBehavior == HabitsRecordScrollBehavior.page, + ), + ), + ), + Selector( + selector: (context, vm) => vm.changeRecordStatus, + shouldRebuild: (previous, next) => previous != next, + builder: (context, value, child) => L10nBuilder( + builder: (context, l10n) => LayoutBuilder( + builder: (context, constraints) => + AppSettingDisplayRecordOperationTile( + isLargeScreen: + constraints.maxWidth >= kHabitLargeScreenAdaptWidth, + inputAction: value, + title: l10n != null + ? Text(l10n.appSetting_changeRecordStatusOpTile_titleText) + : null, + subtitle: l10n != null + ? Text( + l10n.appSetting_changeRecordStatusOpTile_subtitleText) + : null, + onSelected: _onChangeRecordStatusSelected, + ), + ), + ), + ), + Selector( + selector: (context, vm) => vm.openRecordStatusDialog, + shouldRebuild: (previous, next) => previous != next, + builder: (context, value, child) => L10nBuilder( + builder: (context, l10n) => LayoutBuilder( + builder: (context, constraints) => + AppSettingDisplayRecordOperationTile( + isLargeScreen: + constraints.maxWidth >= kHabitLargeScreenAdaptWidth, + inputAction: value, + title: l10n != null + ? Text(l10n + .appSetting_openRecordStatusDialogOpTile_titleText) + : null, + subtitle: l10n != null + ? Text(l10n + .appSetting_openRecordStatusDialogOpTile_subtitleText) + : null, + onSelected: _onOpenRecordStatusDialogSelected, + ), + ), + ), + ), + ]; + + Iterable buildReminderSubGroup(BuildContext context) => [ + GroupTitleListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_reminderSubgroupText) + : const Text("Reminder"), + ), + ), + Selector( + selector: (context, vm) => vm.reminder, + shouldRebuild: (previous, next) => previous != next, + builder: (context, reminder, child) => L10nBuilder( + builder: (context, l10n) => AppSettingReminderTile( + config: reminder, + onSwitchButtonChanged: (value) => value + ? context.read().switchOn(l10n: l10n) + : context + .read() + .switchOff(l10n: l10n), + onTimePicked: (value) => context + .read() + .switchToDaily(timeOfDay: value, l10n: l10n), + ), + ), + ), + ]; + + Iterable buildBackupAndRestoreSubGroup(BuildContext context) => [ + GroupTitleListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_backupAndRestoreSubgroupText) + : const Text("Backup & restore"), + ), + ), + L10nBuilder( + builder: (context, l10n) => ListTile( title: l10n != null - ? Text(l10n.appSetting_changeRecordStatusOpTile_titleText) - : null, + ? Text(l10n.appSetting_export_titleText) + : const Text("Export"), subtitle: l10n != null - ? Text(l10n.appSetting_changeRecordStatusOpTile_subtitleText) - : null, - onSelected: _onChangeRecordStatusSelected, + ? Text(l10n.appSetting_export_subtitleText) + : const Text("Exported habits as JSON format, " + "This file can be import back"), + onTap: () => _onExportAllTilePressed(context), ), ), - ), - ); - yield Selector( - selector: (context, vm) => vm.openRecordStatusDialog, - shouldRebuild: (previous, next) => previous != next, - builder: (context, value, child) => L10nBuilder( - builder: (context, l10n) => LayoutBuilder( - builder: (context, constraints) => - AppSettingDisplayRecordOperationTile( - isLargeScreen: - constraints.maxWidth >= kHabitLargeScreenAdaptWidth, - inputAction: value, + L10nBuilder( + builder: (context, l10n) => ListTile( title: l10n != null - ? Text(l10n.appSetting_openRecordStatusDialogOpTile_titleText) - : null, + ? Text(l10n.appSetting_import_titleText) + : const Text("Import"), subtitle: l10n != null - ? Text( - l10n.appSetting_openRecordStatusDialogOpTile_subtitleText) - : null, - onSelected: _onOpenRecordStatusDialogSelected, + ? Text(l10n.appSetting_import_subtitleText) + : const Text("Import habits from json file"), + onTap: _onImportAllTilePressed, ), ), - ), - ); - } - - Iterable buildReminderSubGroup(BuildContext context) sync* { - yield GroupTitleListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_reminderSubgroupText) - : const Text("Reminder"), - ), - ); - yield Selector( - selector: (context, vm) => vm.reminder, - shouldRebuild: (previous, next) => previous != next, - builder: (context, reminder, child) => L10nBuilder( - builder: (context, l10n) => AppSettingReminderTile( - config: reminder, - onSwitchButtonChanged: (value) => value - ? context.read().switchOn(l10n: l10n) - : context.read().switchOff(l10n: l10n), - onTimePicked: (value) => context - .read() - .switchToDaily(timeOfDay: value, l10n: l10n), + L10nBuilder( + builder: (context, l10n) => ListTile( + title: l10n != null + ? Text(l10n.appSetting_resetConfig_titleText) + : const Text("Reset configs"), + subtitle: l10n != null + ? Text(l10n.appSetting_resetConfig_subtitleText) + : const Text("Reset all configs to default"), + onTap: _onResetConfigsTilePressed, + ), ), - ), - ); - } - - Iterable buildBackupAndRestoreSubGroup(BuildContext context) sync* { - yield GroupTitleListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_backupAndRestoreSubgroupText) - : const Text("Backup & restore"), - ), - ); - yield L10nBuilder( - builder: (context, l10n) => ListTile( - title: l10n != null - ? Text(l10n.appSetting_export_titleText) - : const Text("Export"), - subtitle: l10n != null - ? Text(l10n.appSetting_export_subtitleText) - : const Text("Exported habits as JSON format, " - "This file can be import back"), - onTap: () => _onExportAllTilePressed(context), - ), - ); - yield L10nBuilder( - builder: (context, l10n) => ListTile( - title: l10n != null - ? Text(l10n.appSetting_import_titleText) - : const Text("Import"), - subtitle: l10n != null - ? Text(l10n.appSetting_import_subtitleText) - : const Text("Import habits from json file"), - onTap: _onImportAllTilePressed, - ), - ); - yield L10nBuilder( - builder: (context, l10n) => ListTile( - title: l10n != null - ? Text(l10n.appSetting_resetConfig_titleText) - : const Text("Reset configs"), - subtitle: l10n != null - ? Text(l10n.appSetting_resetConfig_subtitleText) - : const Text("Reset all configs to default"), - onTap: _onResetConfigsTilePressed, - ), - ); - } - - Iterable buildOthersSubGroup(BuildContext context) sync* { - yield GroupTitleListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_otherSubgroupText) - : const Text("Others"), - ), - ); - yield Selector( - selector: (context, vm) => vm.isInDevelopMode, - shouldRebuild: (previous, next) => previous != next, - builder: (context, value, child) => SwitchListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_developMode_titleText) - : const Text("Develop mode"), + ]; + + Iterable buildOthersSubGroup(BuildContext context) => [ + GroupTitleListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_otherSubgroupText) + : const Text("Others"), + ), ), - onChanged: _onDevelopModeSwitchTilePressed, - value: value, - ), - ); - yield ListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_clearCache_titleText) - : const Text("Clear Cache"), - ), - onTap: () => _openClearAppCacheDialog(context), - ); - yield ListTile( - title: L10nBuilder( - builder: (context, l10n) => l10n != null - ? Text(l10n.appSetting_about_titleText) - : const Text("About"), - ), - onTap: () => app_about_view.naviToAppAboutPage(context: context), - ); - } - - Widget buildDevelopSubGroup(BuildContext context) { - return Selector>( - selector: (context, vm) => - Tuple3(vm.isInDevelopMode, vm.displayDebugMenu, vm.loggingLevel), - shouldRebuild: (previous, next) => previous != next, - builder: (context, value, child) => AppSettingDevelopSubGroup( - isInDevelopMode: value.item1, - isDisplayDebugMenuSelect: value.item2, - logLevel: value.item3, - onLogLevelChanged: _onLogLevelChanged, - onDisplayDebugMenuSelectChanged: _onDisplayDebugMenuSelectChanged, - onExportDBTilePressed: _onExportDBTilePressed, - onClearDBTilePressed: _onClearDBTilePressed, - ), - ); - } + Selector( + selector: (context, vm) => vm.isInDevelopMode, + shouldRebuild: (previous, next) => previous != next, + builder: (context, value, child) => SwitchListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_developMode_titleText) + : const Text("Develop mode"), + ), + onChanged: _onDevelopModeSwitchTilePressed, + value: value, + ), + ), + ListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_clearCache_titleText) + : const Text("Clear Cache"), + ), + onTap: () => _openClearAppCacheDialog(context), + ), + ListTile( + title: L10nBuilder( + builder: (context, l10n) => l10n != null + ? Text(l10n.appSetting_about_titleText) + : const Text("About"), + ), + onTap: () => app_about_view.naviToAppAboutPage(context: context), + ), + ]; + + Widget buildDevelopSubGroup(BuildContext context) => + Selector>( + selector: (context, vm) => + Tuple3(vm.isInDevelopMode, vm.displayDebugMenu, vm.loggingLevel), + shouldRebuild: (previous, next) => previous != next, + builder: (context, value, child) => AppSettingDevelopSubGroup( + isInDevelopMode: value.item1, + isDisplayDebugMenuSelect: value.item2, + logLevel: value.item3, + onLogLevelChanged: _onLogLevelChanged, + onDisplayDebugMenuSelectChanged: _onDisplayDebugMenuSelectChanged, + onExportDBTilePressed: _onExportDBTilePressed, + onClearDBTilePressed: _onClearDBTilePressed, + ), + ); return ColorfulNavibar( child: Scaffold( diff --git a/lib/view/page_habit_detail.dart b/lib/view/page_habit_detail.dart index e70f12b3..db5a5835 100644 --- a/lib/view/page_habit_detail.dart +++ b/lib/view/page_habit_detail.dart @@ -192,7 +192,7 @@ class _HabitDetailView extends State if (!mounted) return; viewmodel = context.read(); if (viewmodel.habitDetailData == null) return; - var oldVersion = viewmodel.getInsideVersion(); + final oldVersion = viewmodel.getInsideVersion(); await showHabitEditReplacementRecordCalendarDialog( context: context, habitColorType: viewmodel.habitColorType, @@ -232,7 +232,7 @@ class _HabitDetailView extends State HabitSummaryViewModel? summary; HabitDetailViewModel viewmodel; - var result = await _openHabitOpConfirmDialog( + final result = await _openHabitOpConfirmDialog( context, L10nBuilder( builder: (context, l10n) => l10n != null @@ -295,7 +295,7 @@ class _HabitDetailView extends State HabitSummaryViewModel? summary; HabitDetailViewModel viewmodel; - var result = await _openHabitOpConfirmDialog( + final result = await _openHabitOpConfirmDialog( context, L10nBuilder( builder: (context, l10n) => l10n != null @@ -356,7 +356,7 @@ class _HabitDetailView extends State assert(kDebugMode); return Builder( builder: (context) { - var viewmodel = context.read(); + final viewmodel = context.read(); return ListTile( leading: Icon(Icons.error, color: Theme.of(context).colorScheme.error), @@ -413,11 +413,11 @@ class _HabitDetailView extends State visible: isArchived, text: l10n?.habitDetail_editPopMenu_unarchive ?? "Unarchive", - callback: () => _openHabitUnarchiveConfirmDialog()), + callback: _openHabitUnarchiveConfirmDialog), DetailAppbarActionItemConfig.archive( visible: !isArchived, text: l10n?.habitDetail_editPopMenu_archive ?? "Archive", - callback: () => _openHabitArchiveConfirmDialog()), + callback: _openHabitArchiveConfirmDialog), DetailAppbarActionItemConfig.clone( text: l10n?.habitDetail_editPopMenu_clone ?? "Clone", callback: _onAppbarCloneActionPressed), @@ -426,7 +426,7 @@ class _HabitDetailView extends State callback: () => _exportHabitAndShared(context)), DetailAppbarActionItemConfig.delete( text: l10n?.habitDetail_editPopMenu_delete ?? "Delete", - callback: () => _openHabitDeleteConfirmDialog()), + callback: _openHabitDeleteConfirmDialog), ], ); }, @@ -569,7 +569,7 @@ class _HabitDetailView extends State viewmodel.habitType?.dbCode ?? 0) ?? "", heatmapWeekLabelValueBuilder: (context, protoDate, defaultFormat) { - ThemeData themeData = Theme.of(context); + final ThemeData themeData = Theme.of(context); return FittedBox( child: Text( DateFormat(defaultFormat, localeString).format(protoDate), @@ -578,8 +578,8 @@ class _HabitDetailView extends State ); }, heatmapMonthLabelItemBuilder: (context, date, defaultFormat) { - ThemeData themeData = Theme.of(context); - TextTheme textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; return Text( DateFormat(defaultFormat, localeString).format(date), style: textTheme.labelSmall @@ -608,12 +608,12 @@ class _HabitDetailView extends State int? limit, ValueKey? chartKey, ) { - ThemeData themeData = Theme.of(context); - TextTheme textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; - var chartvm = context.read(); - var direction = chartvm.consumeCachedAnimateDirection(); - var chart = HabitScoreChart( + final chartvm = context.read(); + final direction = chartvm.consumeCachedAnimateDirection(); + final chart = HabitScoreChart( key: chartKey, height: kHabitDetailFreqChartHeight, eachSize: eachSize, @@ -632,7 +632,7 @@ class _HabitDetailView extends State switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeInOut, transitionBuilder: direction != null - ? (Widget child, Animation animation) => SlideTransitionX( + ? (child, animation) => SlideTransitionX( direction: direction, position: animation, child: child, @@ -647,7 +647,7 @@ class _HabitDetailView extends State builder: (context, constraints) { final double textScaleFactor = math.min(MediaQuery.textScaleFactorOf(context), 1.3); - var now = HabitDate.now(); + final now = HabitDate.now(); return HabitDetailScoreChart( padding: kHabitDetailWidgetPadding, eachSize: 48.0, @@ -694,11 +694,11 @@ class _HabitDetailView extends State AxisDirection? animatedDirection, ValueKey? chartKey, }) { - ThemeData themeData = Theme.of(context); - TextTheme textTheme = themeData.textTheme; + final ThemeData themeData = Theme.of(context); + final TextTheme textTheme = themeData.textTheme; - var chartvm = context.read(); - var chart = HabitFreqChart( + final chartvm = context.read(); + final chart = HabitFreqChart( key: chartKey, height: kHabitDetailFreqChartHeight, eachSize: eachSize, @@ -716,7 +716,7 @@ class _HabitDetailView extends State switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeInOut, transitionBuilder: animatedDirection != null - ? (Widget child, Animation animation) => SlideTransitionX( + ? (child, animation) => SlideTransitionX( direction: animatedDirection, position: animation, child: child, @@ -733,12 +733,12 @@ class _HabitDetailView extends State final double textScaleFactor = math.min(MediaQuery.textScaleFactorOf(context), 1.3); - var viewmodel = context.read(); - var now = HabitDate.now(); + final viewmodel = context.read(); + final now = HabitDate.now(); - bool isLargeScreen = + final isLargeScreen = constraints.maxWidth > kHabitLargeScreenAdaptWidth; - var animatedDirection = chartvm.consumeCachedAnimateDirection(); + final animatedDirection = chartvm.consumeCachedAnimateDirection(); return HabitDetailFreqChart( padding: kHabitDetailWidgetPadding, @@ -768,7 +768,7 @@ class _HabitDetailView extends State ), onPopMenuSelected: (combine) { if (!mounted) return; - var viewmodel = context.read(); + final viewmodel = context.read(); if (!viewmodel.mounted) return; viewmodel.updateFreqChartCombine(combine); }, @@ -871,7 +871,7 @@ class _HabitDetailView extends State shouldRebuild: (previous, next) => previous != next, builder: (context, habitColorType, child) => HabitDetailFAB( colorType: habitColorType ?? widget.colorType, - onPressed: () => _openEditDialog(), + onPressed: _openEditDialog, ), ); } @@ -889,10 +889,10 @@ class _HabitDetailView extends State await loading; } - final viewmodel = context.read(); return FutureBuilder( future: loadData(), builder: (context, snapshot) { + final viewmodel = context.read(); appLog.load.debug("$widget.buildBody", ex: ["Loading detail data", snapshot.connectionState]); @@ -901,7 +901,7 @@ class _HabitDetailView extends State ex: ["Loaded", viewmodel.debugGetDataString()]); } - Widget switcherWidget; + final Widget switcherWidget; if (snapshot.inProgress) { switcherWidget = SliverFillRemaining( diff --git a/lib/view/page_habit_edit.dart b/lib/view/page_habit_edit.dart index b4335caf..4ef307f6 100644 --- a/lib/view/page_habit_edit.dart +++ b/lib/view/page_habit_edit.dart @@ -189,7 +189,7 @@ class _HabitEditView extends State { final result = await showTimePicker(context: context, initialTime: TimeOfDay.now()); if (!mounted || result == null) return; - var newReminder = (context.read().reminder ?? + final newReminder = (context.read().reminder ?? HabitReminder.dailyMidnight) .copyWith(time: result); context.read().reminder = newReminder; @@ -555,7 +555,7 @@ class _HabitEditView extends State { //#endregion //#engion build main - var formvm = context.read(); + final formvm = context.read(); return ColorfulNavibar( child: Scaffold( body: CustomScrollView( diff --git a/lib/view/page_habits_display.dart b/lib/view/page_habits_display.dart index bcdfab3e..cb2e4b2a 100644 --- a/lib/view/page_habits_display.dart +++ b/lib/view/page_habits_display.dart @@ -139,6 +139,7 @@ class _HabitsDisplayView extends State void _openHabitArchiveConfirmDialog(BuildContext context) async { HabitSummaryViewModel viewmodel; + final result = await showConfirmDialog( context: context, titleBuilder: (context) { @@ -164,10 +165,10 @@ class _HabitsDisplayView extends State if (!mounted) return; viewmodel = context.read(); - var recordList = await viewmodel.archivedSelectedHabits(); + final recordList = await viewmodel.archivedSelectedHabits(); if (!mounted || recordList == null) return; - var archivedCount = recordList.length; + final archivedCount = recordList.length; viewmodel = context.read(); final snackBar = BuildWidgetHelper().buildSnackBarWithUndo( context, @@ -212,10 +213,10 @@ class _HabitsDisplayView extends State if (!mounted) return; viewmodel = context.read(); - var recordList = await viewmodel.unarchivedSelectedHabits(); + final recordList = await viewmodel.unarchivedSelectedHabits(); if (!mounted || recordList == null) return; - var archivedCount = recordList.length; + final archivedCount = recordList.length; viewmodel = context.read(); final snackBar = BuildWidgetHelper().buildSnackBarWithUndo( context, @@ -260,10 +261,10 @@ class _HabitsDisplayView extends State if (!mounted) return; viewmodel = context.read(); - var recordList = await viewmodel.deleteSelectedHabits(); + final recordList = await viewmodel.deleteSelectedHabits(); if (!mounted || recordList == null) return; - var deletedCount = recordList.length; + final deletedCount = recordList.length; viewmodel = context.read(); final snackBar = BuildWidgetHelper().buildSnackBarWithUndo( context, @@ -368,14 +369,15 @@ class _HabitsDisplayView extends State HabitRecordDate date, HabitRecordStatus crt, ) async { - HabitDailyGoal crtNum; + HabitSummaryViewModel viewmodel; - var viewmodel = context.read(); - var data = viewmodel.getHabit(parentUUID); + viewmodel = context.read(); + final data = viewmodel.getHabit(parentUUID); if (data == null) return; - var record = data.getRecordByDate(date); - num orgNum = record?.value ?? -1; + final HabitDailyGoal crtNum; + final record = data.getRecordByDate(date); + final orgNum = record?.value ?? -1; if (record != null) { if (record.status != HabitRecordStatus.done) return; crtNum = record.value; @@ -398,6 +400,8 @@ class _HabitsDisplayView extends State ); if (result == null || result == orgNum || !mounted) return; + viewmodel = context.read(); + if (!viewmodel.mounted) return; viewmodel.changeRecordValue(parentUUID, date, result); } @@ -446,7 +450,7 @@ class _HabitsDisplayView extends State Future _onFABPressed() async { if (!mounted) return; - var viewmodel = context.read(); + final viewmodel = context.read(); if (viewmodel.isInEditMode) { context.read().exitEditMode(); await Future.delayed(_kPressFABAnimateDuration); @@ -600,7 +604,7 @@ class _HabitsDisplayView extends State bool _onHabitListReorderStart(int index, double dx, double dy) { if (!mounted) return false; - var viewmodel = context.read(); + final viewmodel = context.read(); if (!viewmodel.canBeDragged) return false; if (!viewmodel.isInEditMode) { @@ -608,13 +612,13 @@ class _HabitsDisplayView extends State ..hideCurrentSnackBar() ..clearSnackBars(); viewmodel.switchToEditMode(); - var data = viewmodel.getHabitBySortId(index); + final data = viewmodel.getHabitBySortId(index); if (data is HabitSummaryDataSortCache) { viewmodel.selectHabit(data.uuid, listen: false); } } - var sortOptions = context.read(); + final sortOptions = context.read(); if (sortOptions.sortType != HabitDisplaySortType.manual) return false; return true; @@ -623,7 +627,7 @@ class _HabitsDisplayView extends State bool _onHabitListReorderMove(int index, int dropIndex) { if (!mounted) return false; - var viewmodel = context.read(); + final viewmodel = context.read(); if (index != dropIndex && viewmodel.isInEditMode) { viewmodel.exitEditModeOnly(); } @@ -633,7 +637,7 @@ class _HabitsDisplayView extends State bool _onHabitListReorderComplete(int index, int dropIndex, Object? slot) { if (!mounted) return false; - var viewmodel = context.read(); + final viewmodel = context.read(); if (index != dropIndex) { viewmodel.onHabitReorderComplate(index, dropIndex); viewmodel.exitEditMode(listen: false); @@ -648,8 +652,7 @@ class _HabitsDisplayView extends State void preessedInEditMode() { if (!mounted) return; - var viewmodel = context.read(); - + final viewmodel = context.read(); if (viewmodel.isHabitSelected(uuid)) { viewmodel.unselectHabit(uuid); } else { @@ -712,10 +715,8 @@ class _HabitsDisplayView extends State void _onHabitEditAppbarLeadingButtonPressed() { if (!mounted) return; - var viewmodel = context.read(); - WidgetsBinding.instance.addPostFrameCallback((_) { - viewmodel.exitEditMode(); - }); + final viewmodel = context.read(); + viewmodel.exitEditMode(); } ScrollPhysics? _buildScrollPhysics(double itemSize, double length) => @@ -914,7 +915,7 @@ class _HabitsDisplayView extends State isExtended: isExtended, collapsePrt: occupyPrt, ), - actionBuilder: (context) => buildEditAppbarActions(context), + actionBuilder: buildEditAppbarActions, onLeadingButtonPressed: _onHabitEditAppbarLeadingButtonPressed, ); }, @@ -927,7 +928,7 @@ class _HabitsDisplayView extends State selector: (context, viewmodel) => viewmodel.currentState, shouldRebuild: (previous, next) => previous != next, builder: (context, status, child) { - var viewmodel = context.read(); + final viewmodel = context.read(); appLog.build.debug(context, ex: [status], name: "$widget.Appbar"); return SliverAnimatedSwitcher( duration: _kEditModeChangeAnimateDuration, @@ -946,14 +947,16 @@ class _HabitsDisplayView extends State selector: (context, viewmodel) => viewmodel.reloadUIToggleSwitch, shouldRebuild: (previous, next) => previous != next, builder: (context, value, child) { - var viewmodel = context.read(); + final viewmodel = context.read(); appLog.build.debug(context, ex: [value], name: "$widget.HabitList"); return AnimatedSliverList( controller: viewmodel.dispatcherLinkedController, delegate: AnimatedSliverChildBuilderDelegate( (context, index, data) { - return viewmodel.dispatcherLinkedBuilder( - context, viewmodel.lastSortedDataCache, index, data); + return context + .read() + .dispatcherLinkedBuilder( + context, viewmodel.lastSortedDataCache, index, data); }, viewmodel.lastSortedDataCache.length, addAnimatedElevation: _kCommonEvalation, @@ -988,10 +991,10 @@ class _HabitsDisplayView extends State } } - final viewmodel = context.read(); return FutureBuilder( future: loadData(), builder: (context, snapshot) { + final viewmodel = context.read(); appLog.load.debug("$widget.buildHabits", ex: [ "Loading data", snapshot.connectionState, diff --git a/test/common_test/math_test.dart b/test/common_test/math_test.dart index f46eaa0f..445b6f71 100644 --- a/test/common_test/math_test.dart +++ b/test/common_test/math_test.dart @@ -20,7 +20,7 @@ import 'package:tuple/tuple.dart'; void main() { group('test intervalTrans', () { test("intervalTrans 01", () { - var result = intervalTrans( + final result = intervalTrans( 55, itervFrom: const Tuple2(0, 100), itervTo: const Tuple2(-10, 10), @@ -28,7 +28,7 @@ void main() { expect(result, 1.0); }); test("intervalTrans 02", () { - var result = intervalTrans( + final result = intervalTrans( 24, itervFrom: const Tuple2(0, 100), itervTo: const Tuple2(-10, 10), @@ -38,9 +38,9 @@ void main() { }); group('test habitGrowCurve', () { test('baisc 10', () { - var xlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - var ylist = []; - var cylist = [ + final xlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + final ylist = []; + final cylist = [ 0.0, 2.2, 6.76, @@ -53,8 +53,8 @@ void main() { 97.8, 100.0 ]; - var days = 10; - var interv = Tuple2( + const days = 10; + final interv = Tuple2( habitGrowCurve(x: 0, days: days), habitGrowCurve(x: days, days: days), ); @@ -66,7 +66,7 @@ void main() { }); }); test('baisc 66', () { - var xlist = [ + final xlist = [ 0, 1, 2, @@ -135,8 +135,8 @@ void main() { 65, 66 ]; - var ylist = []; - var cylist = [ + final ylist = []; + final cylist = [ 0.0, 0.24, 0.5, @@ -205,8 +205,8 @@ void main() { 99.76, 100.0 ]; - var days = 66; - var interv = Tuple2( + const days = 66; + final interv = Tuple2( habitGrowCurve(x: 0, days: days), habitGrowCurve(x: days, days: days), ); @@ -221,9 +221,9 @@ void main() { group('test habitCrowCurveInverse', () { test('basic 10', () { - var cxlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - var xlist = []; - var ylist = [ + final cxlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + final xlist = []; + final ylist = [ 0.0, 2.2, 6.76, @@ -236,8 +236,8 @@ void main() { 97.8, 100.0 ]; - var days = 10; - var interv = Tuple2( + const days = 10; + final interv = Tuple2( habitGrowCurve(x: 0, days: days), habitGrowCurve(x: days, days: days), ); diff --git a/test/common_test/utils_test.dart b/test/common_test/utils_test.dart index a14b8dd4..bc337807 100644 --- a/test/common_test/utils_test.dart +++ b/test/common_test/utils_test.dart @@ -19,9 +19,9 @@ import 'package:mhabit/common/utils.dart'; void main() { group("test combineIterables", () { test("test normal combine", () { - var list1 = [1, 4, 7, 10, 99]; - var list2 = [2, 4, 8, 9, 12, 45]; - var list3 = []; + final list1 = [1, 4, 7, 10, 99]; + final list2 = [2, 4, 8, 9, 12, 45]; + final list3 = []; list3 ..addAll(list1) ..addAll(list2); @@ -34,34 +34,34 @@ void main() { }); group('test clamp', () { test('clamp should return value within range', () { - num clampedValue = clamp(5, min: 0, max: 10); + final num clampedValue = clamp(5, min: 0, max: 10); expect(clampedValue, 5); }); test('clamp should return min when value is less than min', () { - num clampedValue = clamp(-2, min: 0, max: 10); + final num clampedValue = clamp(-2, min: 0, max: 10); expect(clampedValue, 0); }); test('clamp should return max when value is greater than max', () { - num clampedValue = clamp(15.0, min: 0.0, max: 10.0); + final num clampedValue = clamp(15.0, min: 0.0, max: 10.0); expect(clampedValue, 10.0); }); }); group('test clampInt', () { test('clampInt should return value within range', () { - int clampedValue = clampInt(5, min: 0, max: 10); + final int clampedValue = clampInt(5, min: 0, max: 10); expect(clampedValue, 5); }); test('clampInt should return min when value is less than min', () { - int clampedValue = clampInt(-2, min: 0, max: 10); + final int clampedValue = clampInt(-2, min: 0, max: 10); expect(clampedValue, 0); }); test('clampInt should return max when value is greater than max', () { - int clampedValue = clampInt(15, min: 0, max: 10); + final int clampedValue = clampInt(15, min: 0, max: 10); expect(clampedValue, 10); }); }); diff --git a/test/debug/habitrecord_automark.dart b/test/debug/habitrecord_automark.dart index b573743e..d327afb0 100644 --- a/test/debug/habitrecord_automark.dart +++ b/test/debug/habitrecord_automark.dart @@ -30,11 +30,11 @@ void main() { void cusomFreqPerformanceTest( {int preRecordNum = 365, dataNum = 1, days = 99, freq = 3}) { - var rng = Random(); + final rng = Random(); var crtDate = HabitStartDate(2022, 1, 1); - var dataList = []; + final dataList = []; for (var i = 1; i <= dataNum; i++) { - var data = HabitSummaryData( + final data = HabitSummaryData( id: i, uuid: 'h$i', type: HabitType.normal, @@ -54,7 +54,7 @@ void cusomFreqPerformanceTest( for (var data in dataList) { for (var _ = 0; _ < preRecordNum; _++) { - var nextDayOffset = rng.nextInt(2); + final nextDayOffset = rng.nextInt(2); crtDate = crtDate.addDays(nextDayOffset); data.addRecord(HabitSummaryRecord.generate( crtDate, @@ -64,16 +64,16 @@ void cusomFreqPerformanceTest( } } - var dl = []; - Stopwatch stopwatch = Stopwatch(); + final dl = []; + final Stopwatch stopwatch = Stopwatch(); for (var data in dataList) { stopwatch.start(); data.reCalculateAutoComplateRecords(firstDay: DateTime.monday); stopwatch.stop(); - var count = stopwatch.elapsed; + final count = stopwatch.elapsed; debugPrint('data $data recalc executed in $count ms'); dl.add(count.inMicroseconds); - var sortedData = + final sortedData = data.debugGetAutoMarkedRecordsCopy().sorted((a, b) => a.compareTo(b)); debugPrint('dateCount: ${sortedData.length}'); debugPrint('--------------------------------------------'); @@ -84,9 +84,9 @@ void cusomFreqPerformanceTest( } void sinplePerformanceTest({int preRecordNum = 365, days = 99, freq = 3}) { - var rng = Random(); + final rng = Random(); var crtDate = HabitStartDate(2022, 1, 1); - var data = HabitSummaryData( + final data = HabitSummaryData( id: 1, uuid: 'hsingle', type: HabitType.normal, @@ -111,15 +111,15 @@ void sinplePerformanceTest({int preRecordNum = 365, days = 99, freq = 3}) { )); } - var dl = []; - Stopwatch stopwatch = Stopwatch(); + final dl = []; + final Stopwatch stopwatch = Stopwatch(); stopwatch.start(); data.reCalculateAutoComplateRecords(firstDay: DateTime.monday); stopwatch.stop(); - var count = stopwatch.elapsed; + final count = stopwatch.elapsed; debugPrint('data $data recalc executed in $count ms'); dl.add(count.inMicroseconds); - var sortedData = + final sortedData = data.debugGetAutoMarkedRecordsCopy().sorted((a, b) => a.compareTo(b)); debugPrint('dateCount: ${sortedData.length}'); debugPrint('--------------------------------------------'); @@ -130,7 +130,7 @@ void sinplePerformanceTest({int preRecordNum = 365, days = 99, freq = 3}) { void functionTest() { debugPrint("debug::habit reocrd auto mark"); - var data = HabitSummaryData( + final data = HabitSummaryData( id: 1, uuid: 'h1', type: HabitType.normal, @@ -202,7 +202,7 @@ void functionTest() { value: 10.0, )); - Stopwatch stopwatch = Stopwatch()..start(); + final Stopwatch stopwatch = Stopwatch()..start(); data.reCalculateAutoComplateRecords(firstDay: DateTime.monday); stopwatch.stop(); debugPrint('executed in ${stopwatch.elapsed.inMilliseconds} ms'); diff --git a/test/debug/habitrecord_calc_totalscore.dart b/test/debug/habitrecord_calc_totalscore.dart index 8e49af07..0557e5ae 100644 --- a/test/debug/habitrecord_calc_totalscore.dart +++ b/test/debug/habitrecord_calc_totalscore.dart @@ -25,10 +25,10 @@ void main() { } void sinplePerformanceTest({int preRecordNum = 365, days = 5, freq = 3}) { - var rng = Random(); - var starDate = HabitStartDate(2022, 1, 1); + final rng = Random(); + final starDate = HabitStartDate(2022, 1, 1); var crtDate = starDate; - var data = HabitSummaryData( + final data = HabitSummaryData( id: 1, uuid: 'hsingle', type: HabitType.normal, @@ -53,10 +53,10 @@ void sinplePerformanceTest({int preRecordNum = 365, days = 5, freq = 3}) { )); } - Stopwatch stopwatch = Stopwatch(); + final Stopwatch stopwatch = Stopwatch(); data.reCalculateAutoComplateRecords(firstDay: DateTime.monday); stopwatch.start(); - var r = data.debugCalcTotalScore(endDate: starDate.addDays(preRecordNum)); + final r = data.debugCalcTotalScore(endDate: starDate.addDays(preRecordNum)); stopwatch.stop(); debugPrint('run in: ${stopwatch.elapsed.inMilliseconds} ms, r=$r'); } diff --git a/test/model_test/habits_test.dart b/test/model_test/habits_test.dart index f15b9315..0d8be0dc 100644 --- a/test/model_test/habits_test.dart +++ b/test/model_test/habits_test.dart @@ -17,7 +17,7 @@ import 'package:mhabit/persistent/local/handler/habit.dart'; void main() { group("HabitDBCell", () { - var habit1 = const HabitDBCell( + const habit1 = HabitDBCell( id: 1, type: 1, createT: 0, @@ -36,7 +36,7 @@ void main() { remindCustom: "remindCustasdam", remindQuestion: "remindQuestion", sortPosition: 2); - var habit2 = const HabitDBCell( + const habit2 = HabitDBCell( name: 'name', desc: 'desc', color: 1, @@ -50,7 +50,7 @@ void main() { remindQuestion: "remindQuestion", sortPosition: 2); test("Constructor::fromMap", () { - var data = { + final data = { "id_": 1, "uuid": "31db76a6-da84-4eca-abc4-a419b4920a11", "name": "0 overleisured", @@ -67,10 +67,10 @@ void main() { HabitDBCell.fromJson(data); }); test("toMap", () { - var result1 = habit1.toJson(); + final result1 = habit1.toJson(); expect(result1[HabitDBCellKey.type], 1); expect(result1[HabitDBCellKey.id], 1); - var result2 = habit2.toJson(); + final result2 = habit2.toJson(); expect(result2[HabitDBCellKey.name], 'name'); expect(result2.containsKey(HabitDBCellKey.id), false); }); diff --git a/test/model_test/records_test.dart b/test/model_test/records_test.dart index 11ac8dab..f9870d2e 100644 --- a/test/model_test/records_test.dart +++ b/test/model_test/records_test.dart @@ -17,7 +17,7 @@ import 'package:mhabit/persistent/local/handler/record.dart'; void main() { group("RecordDBCell", () { - var record1 = RecordDBCell( + final record1 = RecordDBCell( id: 1, parentId: 1, recordDate: 1, @@ -26,7 +26,7 @@ void main() { createT: 1, modifyT: 1, uuid: 'xxx'); - var record2 = RecordDBCell( + final record2 = RecordDBCell( parentId: 1, recordDate: 1, recordValue: 1.2, @@ -34,11 +34,11 @@ void main() { modifyT: 1, uuid: 'xxx'); test("toMap", () { - var result1 = record1.toJson(); + final result1 = record1.toJson(); expect(result1[RecordDBCellKey.parentId], 1); expect(result1[RecordDBCellKey.id], 1); expect(result1[RecordDBCellKey.recordType], 1); - var result2 = record2.toJson(); + final result2 = record2.toJson(); expect(result2[RecordDBCellKey.parentId], 1); expect(result2.containsKey(RecordDBCellKey.id), false); }); diff --git a/test/model_test/score_test.dart b/test/model_test/score_test.dart index a3c7a733..48b8d391 100644 --- a/test/model_test/score_test.dart +++ b/test/model_test/score_test.dart @@ -18,8 +18,8 @@ import 'package:collection/collection.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mhabit/model/habit_date.dart'; import 'package:mhabit/model/habit_form.dart'; -import 'package:mhabit/model/habit_summary.dart'; import 'package:mhabit/model/habit_score.dart'; +import 'package:mhabit/model/habit_summary.dart'; import 'package:tuple/tuple.dart'; import '../stub/habit_score.dart'; @@ -48,7 +48,7 @@ class HabitScoreTestCase extends TestCase { void groupTestScore() => group("test NormalHabitScore", () { test("NormalHabitScore::init", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect(hs.targetDays, 100); expect(hs.dailyGoal, 10); expect(hs.scoreNormal, 1.0); @@ -59,7 +59,7 @@ class HabitScoreTestCase extends TestCase { expect(hs.prtPartial, -0.5); }); test("NormalHabitScore::calcRealScoreExtra", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect(hs.debugCalcRealScoreExtra(10, 100, null), 1.0); expect(hs.debugCalcRealScoreExtra(110, 100, null), 1.1); expect(hs.debugCalcRealScoreExtra(150, 100, null), 1.5); @@ -67,7 +67,7 @@ class HabitScoreTestCase extends TestCase { }); test("NormalHabitScore::calcRealScoreExtra with extendedVal", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect(hs.debugCalcRealScoreExtra(100, 100, 150), 1.0); expect(hs.debugCalcRealScoreExtra(100, 100, 300), 1.0); expect(hs.debugCalcRealScoreExtra(200, 100, 150), 1.5); @@ -77,7 +77,7 @@ class HabitScoreTestCase extends TestCase { expect(hs.debugCalcRealScoreExtra(300, 100, 1100), 1.1); }); test("NormalHabitScore::calcDecreasedPrt:noAutoComplete", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect( hs.calcDecreasedPrt( autoCompleted: false, @@ -144,7 +144,7 @@ class HabitScoreTestCase extends TestCase { ); }); test("NormalHabitScore::calcDecreasedPrt:autoComplete", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect( hs.calcDecreasedPrt( autoCompleted: true, @@ -211,7 +211,7 @@ class HabitScoreTestCase extends TestCase { ); }); test("NormalHabitScore::calcIncreasedDay:noAutoComplete", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect( hs.calcIncreasedDay( autoCompleted: false, @@ -270,7 +270,7 @@ class HabitScoreTestCase extends TestCase { ); }); test("NormalHabitScore::calcIncreasedDay:autoComplete", () { - var hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NormalHabitScore(targetDays: 100, dailyGoal: 10); expect( hs.calcIncreasedDay( autoCompleted: true, @@ -329,10 +329,10 @@ class HabitScoreTestCase extends TestCase { ); }); test("NormalHabitScore::calcHabitGrowCurveValue", () { - var hs = NormalHabitScore(targetDays: 10, dailyGoal: 10); - var xlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - var ylist = []; - var cylist = [ + final hs = NormalHabitScore(targetDays: 10, dailyGoal: 10); + final xlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + final ylist = []; + final cylist = [ 0.0, 2.2, 6.76, @@ -357,7 +357,7 @@ class HabitScoreTestCase extends TestCase { void groupTestNeScore() => group("test NegativeHabitScore", () { test("NormalHabitScore::init", () { - var hs = NegativeHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NegativeHabitScore(targetDays: 100, dailyGoal: 10); expect(hs.targetDays, 100); expect(hs.dailyGoal, 10); expect(hs.scoreNormal, 1.0); @@ -368,13 +368,13 @@ class HabitScoreTestCase extends TestCase { expect(hs.prtPartial, -0.5); }); test("NormalHabitScore::calcRealScoreExtra", () { - var hs = NegativeHabitScore(targetDays: 100, dailyGoal: 10); + final hs = NegativeHabitScore(targetDays: 100, dailyGoal: 10); expect(hs.debugCalcRealScoreExtra(99, 100, null), 0); expect(hs.debugCalcRealScoreExtra(100, 100, null), 1.0); expect(hs.debugCalcRealScoreExtra(101, 100, null), 0); }); test("NormalHabitScore::calcRealScoreExtra with extendedVal", () { - var hs = NegativeHabitScore( + final hs = NegativeHabitScore( targetDays: 100, dailyGoal: 10, dailGoalExtra: 100); expect(hs.debugCalcRealScoreExtra(150, 100, 200), 1.25); expect(hs.debugCalcRealScoreExtra(100, 100, 150), 1.5); @@ -408,7 +408,7 @@ class HabitScoreCalculatorTestCase extends TestCase { void groupTestCalc() => group("test HabitScoreCalculator calc total score", () { test("HabitScoreCalculator calc normal", () { - var dateList = [ + final dateList = [ HabitDate(2020, 1, 1), HabitDate(2020, 1, 2), HabitDate(2020, 1, 3), @@ -421,7 +421,7 @@ class HabitScoreCalculatorTestCase extends TestCase { HabitDate(2020, 1, 10), ]; - var data = >{}; + final data = >{}; for (var i in dateList) { data[i] = Tuple2( HabitSummaryRecord.generate( @@ -432,7 +432,7 @@ class HabitScoreCalculatorTestCase extends TestCase { false); } - var calc = HabitScoreCalculator( + final calc = HabitScoreCalculator( habitScore: HabitScore.getImp( type: HabitType.normal, targetDays: 10, dailyGoal: 1), startDate: HabitDate(2020, 1, 1), @@ -450,7 +450,7 @@ class HabitScoreCalculatorTestCase extends TestCase { expect(result >= 100.0, true); }); test("HabitScoreCalculator calc with some failed", () { - var dateList = [ + final dateList = [ HabitDate(2020, 1, 1), HabitDate(2020, 1, 2), HabitDate(2020, 1, 3), @@ -462,7 +462,7 @@ class HabitScoreCalculatorTestCase extends TestCase { HabitDate(2020, 1, 9), HabitDate(2020, 1, 10), ]; - var valueList = [ + final valueList = [ 0.0, // d: 0.00 s: 0.00 0.0, // d: 0.00 s: 0.00 10.0, // d: 1.00 s: 3.92 @@ -475,7 +475,7 @@ class HabitScoreCalculatorTestCase extends TestCase { 10.0 // d: 7.55 s: 89.97 ]; - var data = >{}; + final data = >{}; dateList.forEachIndexed((index, element) { data[element] = Tuple2( HabitSummaryRecord.generate( @@ -486,7 +486,7 @@ class HabitScoreCalculatorTestCase extends TestCase { false); }); - var calc = HabitScoreCalculator( + final calc = HabitScoreCalculator( habitScore: HabitScore.getImp( type: HabitType.normal, targetDays: 10, dailyGoal: 10.0), startDate: HabitDate(2020, 1, 1), @@ -504,7 +504,7 @@ class HabitScoreCalculatorTestCase extends TestCase { expect(double.parse(result.toStringAsFixed(2)), 89.97); }); test("HabitScoreCalculator calc with automarked", () { - var dateList = [ + final dateList = [ HabitDate(2020, 1, 1), HabitDate(2020, 1, 2), HabitDate(2020, 1, 3), @@ -516,7 +516,7 @@ class HabitScoreCalculatorTestCase extends TestCase { HabitDate(2020, 1, 9), HabitDate(2020, 1, 10), ]; - var valueList = [ + final valueList = [ 0.0, // d: 0.00 s: 0.00 0.0, // d: 0.00 s: 0.00 10.0, // d: 1.00 s: 3.92 @@ -529,7 +529,7 @@ class HabitScoreCalculatorTestCase extends TestCase { 10.0 // d: 7.55 s: 89.97 ]; - var data = >{}; + final data = >{}; dateList.forEachIndexed((index, element) { data[element] = Tuple2( HabitSummaryRecord.generate( @@ -540,7 +540,7 @@ class HabitScoreCalculatorTestCase extends TestCase { true); }); - var calc = HabitScoreCalculator( + final calc = HabitScoreCalculator( habitScore: HabitScore.getImp( type: HabitType.normal, targetDays: 10, dailyGoal: 10.0), startDate: HabitDate(2020, 1, 1), @@ -562,7 +562,7 @@ class HabitScoreCalculatorTestCase extends TestCase { void groupTestCalcSubProgress() => group("test HabitScoreCalculator sub methods", () { test('calcEachScoreBetweenRecordDate', () { - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScore.getImp( type: HabitType.normal, targetDays: 20, dailyGoal: 1), startDate: HabitDate(2023, 1, 1), @@ -580,7 +580,7 @@ class HabitScoreCalculatorTestCase extends TestCase { }); test('calcScoreAfterLastRecordToEnd', () { - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScore.getImp( type: HabitType.normal, targetDays: 10, dailyGoal: 1), startDate: HabitDate(2023, 1, 1), @@ -600,7 +600,7 @@ class HabitScoreCalculatorTestCase extends TestCase { test('calcIncreaseDaysBetweenRecordDate, no record', () { const mockValue = 9.8; bool called = false; - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScoreStub.easeTest( hookCalcIncreasedDay: (autoCompleted, status, value) { expect(value, null); @@ -615,7 +615,7 @@ class HabitScoreCalculatorTestCase extends TestCase { isAutoComplated: (date) => false, getHabitRecord: (date) => null); - num result = calculator.calcIncreaseDaysBetweenRecordDate( + final num result = calculator.calcIncreaseDaysBetweenRecordDate( record: null, isAutoCompleted: false); expect(result, equals(mockValue)); expect(called, true); @@ -625,7 +625,7 @@ class HabitScoreCalculatorTestCase extends TestCase { const mockValue = 9.8; const mockStatus = HabitRecordStatus.done; bool called = false; - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScoreStub.easeTest( hookCalcIncreasedDay: (autoCompleted, status, value) { expect(value, mockValue); @@ -642,7 +642,7 @@ class HabitScoreCalculatorTestCase extends TestCase { final record = HabitSummaryRecord.generate(HabitDate.now(), status: mockStatus, value: mockValue); - num result = calculator.calcIncreaseDaysBetweenRecordDate( + final num result = calculator.calcIncreaseDaysBetweenRecordDate( record: record, isAutoCompleted: true); expect(result, equals(mockValue)); expect(called, true); @@ -651,7 +651,7 @@ class HabitScoreCalculatorTestCase extends TestCase { test('calcDecreasePrtBetweenRecordDate, no record', () { const mockValue = 9.8; bool called = false; - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScoreStub.easeTest( hookCalcDecreasedPrt: (autoCompleted, status, value) { expect(value, null); @@ -666,7 +666,7 @@ class HabitScoreCalculatorTestCase extends TestCase { isAutoComplated: (date) => false, getHabitRecord: (date) => null); - num result = calculator.calcDecreasePrtBetweenRecordDate( + final num result = calculator.calcDecreasePrtBetweenRecordDate( record: null, isAutoCompleted: false); expect(result, equals(mockValue)); expect(called, true); @@ -676,7 +676,7 @@ class HabitScoreCalculatorTestCase extends TestCase { const mockValue = 9.8; const mockStatus = HabitRecordStatus.done; bool called = false; - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScoreStub.easeTest( hookCalcDecreasedPrt: (autoCompleted, status, value) { expect(value, mockValue); @@ -693,21 +693,21 @@ class HabitScoreCalculatorTestCase extends TestCase { final record = HabitSummaryRecord.generate(HabitDate.now(), status: mockStatus, value: mockValue); - num result = calculator.calcDecreasePrtBetweenRecordDate( + final num result = calculator.calcDecreasePrtBetweenRecordDate( record: record, isAutoCompleted: true); expect(result, equals(mockValue)); expect(called, true); }); test('triggerScoreChangedEvent', () { - HabitScoreCalculator calculator = HabitScoreCalculator( + final HabitScoreCalculator calculator = HabitScoreCalculator( habitScore: HabitScoreStub.easeTest(), startDate: HabitDate(2023, 1, 1), iterable: [], isAutoComplated: (date) => false, getHabitRecord: (date) => null); - bool result1 = calculator.triggerScoreChangedEvent( + final bool result1 = calculator.triggerScoreChangedEvent( fromDate: HabitDate(2023, 1, 1), fromScore: 50.0, toDate: HabitDate(2023, 1, 5), @@ -721,7 +721,7 @@ class HabitScoreCalculatorTestCase extends TestCase { }); expect(result1, equals(false)); - bool result2 = calculator.triggerScoreChangedEvent( + final bool result2 = calculator.triggerScoreChangedEvent( fromDate: HabitDate(2023, 1, 1), fromScore: 50.0, toDate: HabitDate(2023, 1, 5), @@ -757,7 +757,7 @@ class ArchivedHabitScoreCalculatorTestCase extends TestCase { void groupTestCalc() => group("test ArchivedHabitScoreCalculator calc total score", () { test("ArchivedHabitScoreCalculator calc normal", () { - var dateList = [ + final dateList = [ HabitDate(2020, 1, 1), HabitDate(2020, 1, 2), HabitDate(2020, 1, 3), diff --git a/test/viewmodel_test/app_theme_test.dart b/test/viewmodel_test/app_theme_test.dart index 05a65bbf..f945bb50 100644 --- a/test/viewmodel_test/app_theme_test.dart +++ b/test/viewmodel_test/app_theme_test.dart @@ -23,7 +23,7 @@ import 'package:shared_preferences/shared_preferences.dart'; void main() async { SharedPreferences.setMockInitialValues({}); final profile = ProfileViewModel([ - (pref) => AppThemeTypeProfileHandler(pref), + AppThemeTypeProfileHandler.new, ]); await profile.init(); group("AppThemeViewModel", () { diff --git a/test/viewmodel_test/habit_form_test.dart b/test/viewmodel_test/habit_form_test.dart index cc95d983..24cff806 100644 --- a/test/viewmodel_test/habit_form_test.dart +++ b/test/viewmodel_test/habit_form_test.dart @@ -80,7 +80,7 @@ void main() { final provider = getMockViewModel(); expect( provider.startDate == HabitStartDate.dateTime(DateTime.now()), true); - var newDate = HabitStartDate.dateTime(DateTime(2020, 1, 20)); + final newDate = HabitStartDate.dateTime(DateTime(2020, 1, 20)); provider.addListener(() async { expect(provider.startDate == newDate, true); }); @@ -105,30 +105,30 @@ void main() { }); group("HabitFrequency", () { test("Constructor", () { - var obj = const HabitFrequency( - type: HabitFrequencyType.custom, freq: 1, days: 2); + const obj = + HabitFrequency(type: HabitFrequencyType.custom, freq: 1, days: 2); expect(obj.freq, 1); expect(obj.days, 2); expect(obj.type, HabitFrequencyType.custom); }); test("Constructor.daily", () { - var obj1 = HabitFrequency.custom(days: 5, freq: 2); + final obj1 = HabitFrequency.custom(days: 5, freq: 2); expect(obj1.freq, 2); expect(obj1.days, 5); expect(obj1.type, HabitFrequencyType.custom); - var obj2 = HabitFrequency.custom(days: 5, freq: 5); + final obj2 = HabitFrequency.custom(days: 5, freq: 5); expect(obj2.freq, 1); expect(obj2.days, 1); expect(obj2.type, HabitFrequencyType.custom); }); test("Constructor.weekly", () { - var obj = const HabitFrequency.weekly(freq: 2); + const obj = HabitFrequency.weekly(freq: 2); expect(obj.freq, 2); expect(obj.days, 0); expect(obj.type, HabitFrequencyType.weekly); }); test("Constructor.monthly", () { - var obj = const HabitFrequency.monthly(freq: 10); + const obj = HabitFrequency.monthly(freq: 10); expect(obj.freq, 10); expect(obj.days, 0); expect(obj.type, HabitFrequencyType.monthly); @@ -178,61 +178,61 @@ void main() { "At least 2 times in every 3 days"); }); test('toMap:monthly', () { - var obj2 = const HabitFrequency.monthly(freq: 3); - var obj2map = obj2.toJson(); + const obj2 = HabitFrequency.monthly(freq: 3); + final obj2map = obj2.toJson(); expect(obj2map['type'], HabitFrequencyType.monthly.dbCode); expect((obj2map['args'] as List).length, 1); expect(obj2map['args'][0], 3); }); test('toMap:weekly', () { - var obj3 = const HabitFrequency.weekly(freq: 1); - var obj3map = obj3.toJson(); + const obj3 = HabitFrequency.weekly(freq: 1); + final obj3map = obj3.toJson(); expect(obj3map['type'], HabitFrequencyType.weekly.dbCode); expect((obj3map['args'] as List).length, 1); expect(obj3map['args'][0], 1); }); test('toMap:daily', () { - var obj1 = HabitFrequency.custom(days: 5, freq: 2); - var obj1map = obj1.toJson(); + final obj1 = HabitFrequency.custom(days: 5, freq: 2); + final obj1map = obj1.toJson(); expect(obj1map['type'], HabitFrequencyType.custom.dbCode); expect((obj1map['args'] as List).length, 2); expect(obj1map['args'][0], 2); expect(obj1map['args'][1], 5); }); test('toMapError', () { - var obj = const HabitFrequency(type: HabitFrequencyType.unknown, freq: 0); + const obj = HabitFrequency(type: HabitFrequencyType.unknown, freq: 0); expect(() => obj.toJson(), throwsA(isA())); }); test('fromMap:monthly', () { - var data1 = { + final data1 = { "type": HabitFrequencyType.monthly.dbCode, "args": [10], }; - var obj1 = HabitFrequency.fromJson(data1); + final obj1 = HabitFrequency.fromJson(data1); expect(obj1.type, HabitFrequencyType.monthly); expect(obj1.freq, 10); }); test('fromMap:weekly', () { - var data1 = { + final data1 = { "type": HabitFrequencyType.weekly.dbCode, "args": [5], }; - var obj1 = HabitFrequency.fromJson(data1); + final obj1 = HabitFrequency.fromJson(data1); expect(obj1.type, HabitFrequencyType.weekly); expect(obj1.freq, 5); }); test('fromMap:custom', () { - var data1 = { + final data1 = { "type": HabitFrequencyType.custom.dbCode, "args": [2, 10], }; - var obj1 = HabitFrequency.fromJson(data1); + final obj1 = HabitFrequency.fromJson(data1); expect(obj1.type, HabitFrequencyType.custom); expect(obj1.freq, 2); expect(obj1.days, 10); }); test('fromMap:error', () { - var data1 = { + final data1 = { "type": HabitFrequencyType.unknown.dbCode, "args": [1], };