flutter-github-search
flutter-github-search copied to clipboard
zzzzz
zzzzzzzz
.of(context みたいなの何回も書くのが面倒なのでそのシンタックスシュガーとして
extension BuildContextExtension on BuildContext {
/// テーマ
ThemeData get theme => Theme.of(this);
/// テキストのテーマ
TextTheme get textTheme => Theme.of(this).textTheme;
/// ディスプレイサイズ
Size get displaySize => MediaQuery.of(this).size;
}
コンマ、値段
extension IntExtension on int {
/// コンマをつけた文字列を返す(名前微妙かも)
String get addComma => NumberFormat('#,###').format(this);
/// 1000 → ¥1,000
String get toJPY => '¥${NumberFormat('#,###').format(this)}';
/// 1000 → 1,000 円(名前が上とかぶらないようにわけるか、オプション渡せるようにするか)
String get toJPY => '${NumberFormat('#,###').format(this)} 円';
}
dynamic to bool
extension DynamicExtension on dynamic {
/// っぽい感じの bool にする
bool get tooBool {
if (value == null) {
return false;
}
if (value is bool) {
return value;
}
if (value is int) {
return value == 0;
}
if (value is String) {
return value == '1' || value == 'true' || value == 'True' || value == 'TRUE';
}
return false;
}
}
具体的にまだ書いていないけど、DateTime で DateTime 型 -> 2022-04-21 (水) 22:17 DateTime 型 -> 22:17 DateTime 型 -> 昨日 DateTime 型 -> 2 時間前 DateTime 型 -> 3 日前 みたいなのを LINE のトーク一覧の最新投稿の時刻表示みたいにいい感じにするやつ作りたい
要チェック https://pub.dev/packages/dartx
地味だけど何回も書くのでこんなのを今日仕事で作りました。
extension StringExtension on String {
/// 空文字の場合は指定した文字で代替する
String ifIsEmpty(String placeholder) {
return isEmpty ? placeholder : this;
}
}
とりあえず案出し、コードはもうちょっと待ってください。 カード番号を '0000000000000000'→'0000-0000-0000-0000' '0000000000000000'→'0000 0000 0000 0000'
こんな感じに4つ区切りを色々できれば便利かなと思います。
正規表現系
日本の郵便番号・電話番号をハイフンで区切る
extension ListExtension on List {
/// List<dynamic> を List<Map<String, dynamic>> に変換する。
/// List<dynamic> を as List<Map<String, dynamic>> で変換できないため。
List<Map<String, dynamic>> get toMaps {
final maps = <Map<String, dynamic>>[];
for (final e in this) {
if (e == null) {
continue;
}
try {
maps.add(e as Map<String, dynamic>);
} on Exception {
continue;
// ignore: avoid_catching_errors
} on Error {
continue;
}
}
return maps;
}
}
import 'package:intl/intl.dart';
extension DateTimeExtension on DateTime {
String toYYYYMMDD({String delimiter = '-'}) =>
DateFormat('yyyy${delimiter}MM${delimiter}dd').format(this);
///
String toYYYYMMDDHHMM({String delimiter = '-'}) =>
DateFormat('yyyy${delimiter}MM${delimiter}dd HH:mm').format(this);
}
全角数字を半角数字にする
const _fullLengthCode = 65248;
extension StringExtension on String {
String toHalfWidthNumber() {
final regex = RegExp(r'^[0-9]+$');
final string = runes.map<String>((rune) {
final char = String.fromCharCode(rune);
return regex.hasMatch(char)
? String.fromCharCode(rune - _fullLengthCode)
: char;
});
return string.join();
}
}
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
extension DateTimeEx on DateTime {
String get formatYMDWHM {
initializeDateFormatting('ja_JP');
return DateFormat('yyyy年MM月dd日(E) HH:mm', 'ja_JP').format(this);
}
String get formatYMDW {
initializeDateFormatting('ja_JP');
return DateFormat('yyyy年MM月dd日(E)', 'ja_JP').format(this);
}
String get formatYM {
initializeDateFormatting('ja_JP');
return DateFormat('yyyy年MM月', 'ja_JP').format(this);
}
String get formatHM {
initializeDateFormatting('ja_JP');
return DateFormat('HH:mm', 'ja_JP').format(this);
}
}
import 'package:intl/intl.dart';
extension IntEx on int {
String get money {
final formatter = NumberFormat('#,###');
return '¥${formatter.format(this)}';
}
}
extension IterableEx<E> on Iterable<E> {
// for Null Safety
E? firstWhereOrNull<E>(bool test(E element)) {
for (final element in this) {
if (test(element as E)) {
return element;
}
}
return null;
}
// for Null Safety
E? lastWhereOrNull<E>(bool test(E element)) {
late E result;
var foundMatching = false;
for (final element in this) {
if (test(element as E)) {
result = element;
foundMatching = true;
}
}
if (foundMatching) {
return result;
}
return null;
}
}
extension StringEx on String {
/// メールアドレスの形式かどうかを返す
bool get isEmail => RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+",
).hasMatch(this);
}
extension StringExt on String {
String replaceBreak() {
return replaceAll('\\n', '\n');
}
}
Firebaseで使う
import 'package:flutter/material.dart';
extension ThemeModeHelper on ThemeMode {
static const names = {
ThemeMode.system: '端末設定に従う',
ThemeMode.light: 'ライト',
ThemeMode.dark: 'ダーク',
};
String get name => names[this]!;
String get value => toString().split('.').last;
static ThemeMode indexOf(int? index) {
if (index != null && index >= 0 && index < ThemeMode.values.length) {
return ThemeMode.values[index];
}
return ThemeMode.light;
}
}
- 同じ年だったら年を表示しない、過去だったら年を表示する(day.js)
- クレジットカードの下4桁以外をアスタリスク埋めする
const digits = cardNumber.toString()
digits.split('').map((digit, index) => (index > digits.length - 5 ? digit : '*'))
みたいなのはTSで書きました

extensionは自分でimportを書く必要があるので、 自分こうやって、1つのpackageにまとめて使ってます。
export 'src/date_time.dart';
export 'src/int.dart';
export 'src/iterable.dart';
export 'src/string.dart';
export 'src/theme_mode.dart';
https://pub.dev/packages/quiver
https://pub.dev/packages/number_display
https://pub.dev/packages/hexcolor