アプリで一時的にメッセージを表示したいんだけど、いい方法ないかな?
BuildContext
を使わないでSnackBar
を表示する方法はないかしら?
本記事ではこのような悩み、疑問に答えます。
アプリでエラーメッセージなど、一時的にメッセージを表示したい時に使用する、SnackBar
の表示方法について解説します。
本記事を読めば以下のgifのように、一時的にメッセージを出すことが可能となります。
BuildContext
を使う方法と使わない方法、2つを紹介します。
よく使うテクニックですので、ぜひ読んでみてください!
BuildContextを使う方法
BuildContext
を使ってSnackBar
を表示する方法を紹介します。
方法はとても簡単で、以下のコードを表示したい場所に配置するだけです。
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('メッセージ'),
),
);
サンプルとして導入で紹介したgifのコードを紹介します。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('ページ1'),
backgroundColor: Colors.blue,
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const MySecondPage(),
),
);
},
child: const Text('次のページ'),
),
),
);
}
}
class MySecondPage extends StatelessWidget {
const MySecondPage({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('ページ2'),
backgroundColor: Colors.red,
automaticallyImplyLeading: false,
),
body: Center(
child: Builder(builder: (context) {
return ElevatedButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('メッセージ'),
),
);
Navigator.of(context).pop();
},
child: const Text('前のページ'),
);
}),
),
);
}
}
以上がBuildContext
を使うSnackBar
の表示方法となります。
BuildContextを使わない方法
View
とロジックを完全に切り離したい時など、BuildContext
を使わないでSnackBar
を表示させたい時があると思います。
ここでは、BuildContext
を使わないでSnackBar
を表示させる方法について解説します。
準備として、グローバルにて以下のキーを定義します。
final scaffoldKey = GlobalKey<ScaffoldMessengerState>();
このキーをMaterialApp
に渡します。
MaterialApp(
scaffoldMessengerKey: scaffoldKey,
home: ~
);
SnackBarを使用したい場所で、キーからScaffoldMessengerState
を取り出します。
ScaffoldMessengerState _scaffoldMessangerState = scaffoldKey.currentState!;
このStateを使ってSnackBarを表示させます。
_scaffoldMessangerState.showSnackBar(
const SnackBar(
content: Text('メッセージ'),
),
);
サンプルとしてBuildContext
を使わない場合の導入で紹介したgifのコードを紹介します。
import 'package:flutter/material.dart';
final scaffoldKey = GlobalKey<ScaffoldMessengerState>();
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
scaffoldMessengerKey: scaffoldKey,
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('ページ1'),
backgroundColor: Colors.blue,
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const MySecondPage(),
),
);
},
child: const Text('次のページ'),
),
),
);
}
}
class MySecondPage extends StatelessWidget {
const MySecondPage({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('ページ2'),
backgroundColor: Colors.red,
automaticallyImplyLeading: false,
),
body: Center(
child: Builder(builder: (context) {
return ElevatedButton(
onPressed: () {
ScaffoldMessengerState _scaffoldMessangerState =
scaffoldKey.currentState!;
_scaffoldMessangerState.showSnackBar(
const SnackBar(
content: Text('メッセージ'),
),
);
Navigator.of(context).pop();
},
child: const Text('前のページ'),
);
}),
),
);
}
}
以上がBuildContext
を使わないSnackBar
の表示方法となります。
まとめ
アプリでエラーメッセージなど、一時的にメッセージを表示したい時に使用する、SnackBar
の表示方法について解説しました。
BuildContext
を使う方法と使わない方法、2つを紹介しました。
BuildContext
を使わない方法は使う方法に比べて少し複雑ですが、
自由度高くどこでもSnackBar
を呼び出せるようになるので、有用だと思います。
ぜひ本記事を読んで使ってみてください。
本記事があなたのアプリ開発の一助となれば幸いです。
参考
編集後記(2022/3/25)
最近海外の掲示板のReddit等でFirebaseの代替手段として登場したAppwriteが話題になっています。
この話題に乗っかり自分も使用してみようと思い、ちょっと調べてみました。
現状Cloud版がリリースされておらず、
自前でサーバーを用意し、そこにAppwriteをインストールするという形で利用できるようです。
ローカルのデスクトップでもインストールはできますが、
やはり、Firebaseのように外部データベースとして使用したいため、
現状での採用は、サーバー用意するハードルが高い、そう感じました。
FirebaseがCloudで使えるのは改めて素晴らしいですね。
Cloud版のリリースに向けて開発推進中らしいので、
大人しく待とうと思います。
簡単に利用できるようになったら記事化しようと思いますので、
ぜひお楽しみにお待ちください。
週刊Flutter大学では、Flutterに関する技術記事、Flutter大学についての紹介記事を投稿していきます。
記事の更新情報はFlutter大学Twitterにて告知します。
ぜひぜひフォローをお願いいたします。