flutter-github-search icon indicating copy to clipboard operation
flutter-github-search copied to clipboard

zzzzz

Open kosukesaigusa opened this issue 2 years ago • 0 comments

zzzzzzzz

kosukesaigusa avatar May 03 '22 04:05 kosukesaigusa

.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 のトーク一覧の最新投稿の時刻表示みたいにいい感じにするやつ作りたい

kosukesaigusa avatar Apr 21 '22 13:04 kosukesaigusa

要チェック https://pub.dev/packages/dartx

susatthi avatar Apr 22 '22 05:04 susatthi

地味だけど何回も書くのでこんなのを今日仕事で作りました。

extension StringExtension on String {
  /// 空文字の場合は指定した文字で代替する
  String ifIsEmpty(String placeholder) {
    return isEmpty ? placeholder : this;
  }
}

kosukesaigusa avatar Apr 25 '22 11:04 kosukesaigusa

とりあえず案出し、コードはもうちょっと待ってください。 カード番号を '0000000000000000'→'0000-0000-0000-0000' '0000000000000000'→'0000 0000 0000 0000'

こんな感じに4つ区切りを色々できれば便利かなと思います。

kazukidddd avatar Apr 25 '22 12:04 kazukidddd

正規表現系

susatthi avatar Apr 25 '22 12:04 susatthi

日本の郵便番号・電話番号をハイフンで区切る

kosukesaigusa avatar Apr 25 '22 12:04 kosukesaigusa

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;
  }
}

kosukesaigusa avatar Apr 25 '22 12:04 kosukesaigusa

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);
}

kosukesaigusa avatar Apr 25 '22 12:04 kosukesaigusa

全角数字を半角数字にする

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();
  }
}

yamatatsu10969 avatar Apr 25 '22 12:04 yamatatsu10969

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);
  }
}

susatthi avatar Apr 25 '22 12:04 susatthi

import 'package:intl/intl.dart';

extension IntEx on int {
  String get money {
    final formatter = NumberFormat('#,###');
    return '¥${formatter.format(this)}';
  }
}

susatthi avatar Apr 25 '22 12:04 susatthi

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;
  }
}

susatthi avatar Apr 25 '22 12:04 susatthi

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);
}

susatthi avatar Apr 25 '22 12:04 susatthi

extension StringExt on String {
  String replaceBreak() {
    return replaceAll('\\n', '\n');
  }
}

Firebaseで使う

heyhey1028 avatar Apr 25 '22 12:04 heyhey1028

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;
  }
}

susatthi avatar Apr 25 '22 12:04 susatthi

  • 同じ年だったら年を表示しない、過去だったら年を表示する(day.js)
  • クレジットカードの下4桁以外をアスタリスク埋めする
const digits = cardNumber.toString()
digits.split('').map((digit, index) => (index > digits.length - 5 ? digit : '*'))

みたいなのはTSで書きました

hndrr avatar Apr 25 '22 12:04 hndrr

スクリーンショット 2022-04-25 21 20 27

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';

susatthi avatar Apr 25 '22 12:04 susatthi

https://pub.dev/packages/quiver

susatthi avatar Apr 28 '22 21:04 susatthi

https://pub.dev/packages/number_display

susatthi avatar May 07 '22 05:05 susatthi

https://pub.dev/packages/hexcolor

susatthi avatar May 07 '22 06:05 susatthi