📚

【Flutter】通常のsnackbarとGet.snackbarの動きの比較

2023/01/09に公開約3,600字

Get.snackbarはご存知でしょうか? GetXの機能の一つです。通常のsnackBarと異なり、context無しでsnackBarが呼び出せるのがメリットです。

しかし、実際に実装してみると、通常のsnackBarと動きが異なりました.個人的に戸惑う点であったので、今回は2つのsnackbarの動きに着目して、その違いとをご紹介します。

結論

3パターンに分かれました。ただし、実際はコンストラクターの数が通常のsnackbarの方が多いため、非常にカスタマイズ性が高いです。初心者や簡単に実装したい場合はGet.snackbar。少しデザインとかも気にする場合は通常のsnackbarが良さそうです。

通常のSnackBar Get.snackbar
fixed O X
floating(Fade) O X
floating(slide) X O

1. 通常のsnackbar

2種類のパターンがあります。

a. fixed

下から出てきます。下端にくっついています。

ScaffoldMessenger.of(context).showSnackBar(
  const SnackBar(
    content: Text('text'),
    behavior: SnackBarBehavior.fixed, //デフォルト設定
  ),;

b. floating(Fade)

ふわっと出てきて出現します。また、下端にくっつかず浮いたデザインなのが特徴です。
floatingと言う動きですが、次に示すGet.snackBarのモーションと分けるために、floating(Fade)とこの記事では名付けています。

ScaffoldMessenger.of(context).showSnackBar(
  const SnackBar(
    content: Text('text'),
    behavior: SnackBarBehavior.floating,
  ),
);

2. Get.snackbar

1種類しかありません。カスタマイズ性は上から出すか下から出すか、アニメーションの変化の調整ぐらいしかできません。

floating(Slide)

下からふわっと出てきます。こちらはfloating(slide)と読んで分けています。

Get.snackbar(
  'title',
  'text',
  snackPosition: SnackPosition.BOTTOM,
);

まとめ

特にこだわりがない、簡単に実装したい、初心者だったりコードを単に短くしたい、と言う場合はGet.snackBarがいいと思います。
しかし、多少デザインだったりUXの面もこだわりたい場合は、カスタマイズ性の高い通常のsnacBarを使うのをオススメします。

サンプルコードはこちら

import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return const GetMaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("snackbarの比較"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text('通常のsnackbar'),
            ElevatedButton(
              onPressed: () {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text('text'),
                    behavior: SnackBarBehavior.fixed, //デフォルト設定
                  ),
                );
              },
              child: const Text('fixed'),
            ),
            ElevatedButton(
              onPressed: () {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text('text'),
                    behavior: SnackBarBehavior.floating,
                  ),
                );
              },
              child: const Text('floating(Fade)'),
            ),
            const SizedBox(height: 16),
            const Text('Get.snackbar'),
            ElevatedButton(
              onPressed: () {
                Get.snackbar(
                  'title',
                  'text',
                  snackPosition: SnackPosition.BOTTOM, //デフォルトはTOP
                );
              },
              child: const Text('floating(slide)'),
            ),
          ],
        ),
      ),
    );
  }
}

Discussion

ログインするとコメントできます