17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TORICOAdvent Calendar 2020

Day 21

Flutterの便利なWidgetや書き方

Last updated at Posted at 2020-12-20

普段Dart を書いていて個人的に便利だな〜と思ったWidget や書き方を紹介したいと思います。
また今後便利だなと思ったものは随時追加していきます。

ColoredBox

色をつけたい場合に使用できます。
Containerを使うと色をつけることはできますが、ColoredBoxは色をつけることだけができるWidgetなので役割としても伝わりやすいですし、コードの意味を受け取りやくすなると思います。

Widget build(BuildContext context) {
  return ColoredBox(
    color: Colors.black87,
    child: ...,
  );
}

LicensePage

ライセンス表記に使用できるWidget です。

@override
Widget build(BuildContext context) {
  return LicensePage();
}

LicensePage を使うと下記のようなページを作成することができます。
ライセンス情報を取得するスクリプトを書いたりすることなくライセンスの表示が可能になっています。

Collection if

条件によってWidget を出し分ける際に三項演算子を使ってWidgetの出し分けをすることがあると思いますが、ifを使ったほうが簡潔に少ない記述量で書くことができます。

三項演算子の場合

Widget build(BuildContext context) {
  return Column(
    children: [
      context.watch<PageState>.isLoading
        ? const SizedBox.shrink()
        : const UserName(),
    ],
  );
}

Collection If を使用した場合

Widget build(BuildContext context) {
  return Column(
    children: [
      if (context.watch<PageState>.isLoading)
        const UserName(),
    ],
  );
}

if を使用した記述ができない場合はDartSDKのバージョンを確認してください。
2.6以上のバージョンが必須です

Collection for

いままで map((item) => ....).toList(), で書いていたコードは下記のように書き換えることができます。

Widget build(BuildContext context) {
  return Column(
    children: [
      for (var item in context.watch<PageState>().items)
        ListTile(
          title: Text(item.title),
          onPress: () {
          
          },
        ),
    ], 
  );
}

for を使用した記述ができない場合はDartSDKのバージョンを確認してください。
2.6以上のバージョンが必須です

下記のような書き方もできます。
しかし条件が複雑になると可読性が悪くなるので、where で書けるならwhere で書くことをおすすめします。

Widget build(BuildContext context) {
  return Column(
    children: [
      for (var item in context.watch<PageState>().items)
        if (item.complete)
          ListTile(
            title: Text(item.title),
            onPress: () {
          
            },
          ),
    ], 
  );
}

extensions

extensions method を使うと既存のクラスにメソッドを追加することができます。

Duration で時間を指定する場合下記のようにextensions を用意しておくと、

extension DurationExts on int {
  Duration get toSeconds => Duration(seconds: this);
  Duration get toMilliseconds => Duration(milliseconds: this);
}

ディレイさせる秒数やAPI通信のタイムアウトの秒数などを下記のように書くことができます。
Future.delayed(2.toSeconds, () => {});

extensions の使いすぎると何をしているのかわかりにくくなるので用法・用量を守って正しく使いましょう!

17
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?