Skip to content

Commit

Permalink
Use Dart 2.6 extension-methods
Browse files Browse the repository at this point in the history
  • Loading branch information
神楽坂花火 committed Mar 26, 2020
1 parent f289baa commit 63ad162
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 43 deletions.
32 changes: 32 additions & 0 deletions lib/extension.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:flutter/widgets.dart';

extension ColorX on Color {
static Color fromHexString(String source) {
String s = source.toUpperCase().replaceAll('#', '');
if (s.length == 6) {
s = 'FF$s';
} else if (s.length == 3) {
s = 'FF${s[0] * 2}${s[1] * 2}${s[2] * 2}';
}
return Color(int.parse(s, radix: 16));
}

String get hexString {
return '#${value.toRadixString(16).padLeft(8, '0')}';
}

bool get isDark {
// See https://github.com/FooStudio/tinycolor
return (red * 299 + green * 587 + blue * 114) / 1000 < 128;
}
}

extension StringX on String {
bool get isUuid {
if (isEmpty) return false;
return RegExp(
r'^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$',
caseSensitive: false,
).hasMatch(this);
}
}
20 changes: 9 additions & 11 deletions lib/misc/bean.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import 'dart:convert';

import 'package:dailypics/extension.dart';
import 'package:flutter/widgets.dart';
import 'package:json_annotation/json_annotation.dart';

Expand Down Expand Up @@ -80,26 +81,23 @@ class Picture {
})?.toList();
}

String getCompressedUrl([String style = 'w1080']) {
if (url != null) return url;
return '${cdnUrl}!$style';
}

String toJson() => jsonEncode(_$PictureToJson(this));

static String _urlFromJson(String s) {
return 'https://s1.images.dailypics.cn$s';
}

static Color _colorFromHex(String hex) {
if (hex == null) return null;
hex = hex.toUpperCase().replaceAll('#', '');
if (hex.length == 6) {
hex = 'FF' + hex;
} else if (hex.length == 3) {
hex = 'FF' + hex[0] * 2 + hex[1] * 2 + hex[2] * 2;
}
return Color(int.parse(hex, radix: 16));
static Color _colorFromHex(String source) {
return ColorX.fromHexString(source);
}

static String _colorToHex(Color color) {
if (color == null) return null;
return '#' + color.value.toRadixString(16);
return color?.hexString;
}
}

Expand Down
5 changes: 3 additions & 2 deletions lib/pages/details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'dart:math' as math;
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:dailypics/extension.dart';
import 'package:dailypics/misc/bean.dart';
import 'package:dailypics/model/app.dart';
import 'package:dailypics/utils/api.dart';
Expand Down Expand Up @@ -104,7 +105,7 @@ class _DetailsPageState extends State<DetailsPage> {
Radius radius = Radius.circular(SystemUtils.isIPad(context) ? 16 : 0);
CupertinoThemeData theme = CupertinoTheme.of(context);
return AnnotatedRegion<SystemUiOverlayStyle>(
value: Utils.isDarkColor(data.color) && !SystemUtils.isIPad(context)
value: (data.color?.isDark ?? false) && !SystemUtils.isIPad(context)
? SystemUiOverlayStyle.light
: SystemUiOverlayStyle.dark,
child: AdaptiveScaffold(
Expand Down Expand Up @@ -136,7 +137,7 @@ class _DetailsPageState extends State<DetailsPage> {
AspectRatio(
aspectRatio: data.width / data.height,
child: OptimizedImage(
Utils.getCompressed(data),
data.getCompressedUrl(),
borderRadius: BorderRadius.vertical(top: radius),
heroTag: widget.heroTag,
),
Expand Down
4 changes: 2 additions & 2 deletions lib/pages/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@

import 'dart:async';

import 'package:dailypics/extension.dart';
import 'package:dailypics/components/suggest.dart';
import 'package:dailypics/components/today.dart';
import 'package:dailypics/pages/about.dart';
import 'package:dailypics/pages/details.dart';
import 'package:dailypics/pages/recent.dart';
import 'package:dailypics/utils/utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_ionicons/flutter_ionicons.dart';
Expand Down Expand Up @@ -54,7 +54,7 @@ class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return AnnotatedRegion<SystemUiOverlayStyle>(
value: Utils.isDarkColor(CupertinoTheme.of(context).barBackgroundColor)
value: CupertinoTheme.of(context).barBackgroundColor.isDark
? SystemUiOverlayStyle.light
: SystemUiOverlayStyle.dark,
child: CupertinoTabScaffold(
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/recent.dart
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ class _TileState extends State<_Tile> {
AspectRatio(
aspectRatio: aspectRatio,
child: OptimizedImage(
Utils.getCompressed(widget.data, 'w480'),
widget.data.getCompressedUrl('w480'),
heroTag: widget.heroTag,
),
),
Expand Down
3 changes: 2 additions & 1 deletion lib/pages/search.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import 'dart:async';
import 'dart:ui' show ImageFilter, window;

import 'package:dailypics/extension.dart';
import 'package:dailypics/misc/bean.dart';
import 'package:dailypics/utils/api.dart';
import 'package:dailypics/utils/utils.dart';
Expand Down Expand Up @@ -116,7 +117,7 @@ class _SearchPageState extends State<SearchPage> {
showCancelButton: true,
autofocus: true,
onSubmitted: (value) {
if (Utils.isUuid(value)) {
if (value.isUuid) {
_fetchData(value);
} else if (value.isNotEmpty) {
query = value;
Expand Down
38 changes: 17 additions & 21 deletions lib/utils/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import 'dart:async';
import 'dart:io';

import 'package:dailypics/extension.dart';
import 'package:dailypics/misc/bean.dart';
import 'package:dailypics/utils/http.dart';
import 'package:dio/dio.dart';
Expand Down Expand Up @@ -54,6 +55,22 @@ class SystemUtils {
await _channel.invokeMethod('openAppSettings');
}

static Future<void> makeH2Wallpaper(
Size size,
Offset offset,
Color shadowColor,
double shadowRadius,
) async {
await _channel.invokeMethod('makeH2Wallpaper', {
'width': size.width,
'height': size.height,
'offsetX': offset.dx,
'offsetY': offset.dy,
'shadowColor': shadowColor.hexString,
'shadowRadius': shadowRadius,
});
}

static Future<void> openUrl(String url) {
return launch(url, forceSafariVC: false, forceWebView: false);
}
Expand All @@ -72,27 +89,6 @@ class SystemUtils {
}
}

class Utils {
static String getCompressed(Picture data, [String style = 'w720']) {
if (data.url != null) return data.url;
return '${data.cdnUrl}!$style';
}

static bool isDarkColor(Color c) {
if (c == null) return false;
// See https://github.com/FooStudio/tinycolor
return (c.red * 299 + c.green * 587 + c.blue * 114) / 1000 < 128;
}

static bool isUuid(String input) {
RegExp regExp = RegExp(
r'^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$',
caseSensitive: false,
);
return regExp.hasMatch(input);
}
}

class Settings {
static SharedPreferences _prefs;

Expand Down
8 changes: 3 additions & 5 deletions lib/widget/image_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.

import 'package:dailypics/extension.dart';
import 'package:dailypics/misc/bean.dart';
import 'package:dailypics/pages/details.dart';
import 'package:dailypics/utils/utils.dart';
import 'package:dailypics/widget/animated_transform.dart';
import 'package:dailypics/widget/optimized_image.dart';
import 'package:dailypics/widget/qrcode.dart';
Expand Down Expand Up @@ -69,9 +69,7 @@ class _ImageCardState extends State<ImageCard> {

@override
Widget build(BuildContext context) {
Color textColor = Utils.isDarkColor(widget.data.color)
? CupertinoColors.white
: CupertinoColors.black;
Color textColor = widget.data.color?.isDark ?? false ? Colors.white : Colors.black;
return AnimatedTransform.scale(
scale: scale,
duration: duration,
Expand Down Expand Up @@ -109,7 +107,7 @@ class _ImageCardState extends State<ImageCard> {
AspectRatio(
aspectRatio: widget.aspectRatio,
child: OptimizedImage(
Utils.getCompressed(widget.data),
widget.data.getCompressedUrl(),
heroTag: widget.heroTag,
borderRadius: BorderRadius.circular(16),
),
Expand Down

0 comments on commit 63ad162

Please sign in to comment.