質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

解決済

1回答

2585閲覧

Flutterでスナックバーを部品化したい

HarukaNishiyama

総合スコア28

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2020/10/09 09:45

snackBarをどこからでも使えるように部品かしたいのですが、違うファイルにした途端にエラーが出てしまいます。

スナックバーを形成する部分のみをCustomSnackBarというクラスにした時

import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: '', theme: ThemeData( primarySwatch: Colors.blue, ), home: Homepage(), ); } } class Homepage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('テスト'), ), body: Center( child: Column( children: [ RaisedButton( child: Text('スナックバー表示'), color: Colors.blue, textColor: Colors.white, onPressed: () { final snackbar = CustomSnackBar(); Scaffold.of(context).showSnackBar(snackbar); }, ), ], ), ), ); } } class CustomSnackBar extends SnackBar { @override Widget build(BuildContext context) { return SnackBar( content: Text('10秒後に消えます'), action: SnackBarAction( label: '閉じる', onPressed: () { Scaffold.of(context).removeCurrentSnackBar(); }, ), duration: Duration(seconds: 10), ); } }

ビルドは通るのですが、いざレイズドボタンを押下するとエラーが出ます

'package:flutter/src/material/snack_bar.dart': Failed assertion: line 189 pos 15: 'content != null': is not true.

SnackBarクラスの中のcontenという部分がfalseを返してしまっているという内容のようです。

スナックバーを他のクラスに移すことは不可能なのでしょうか?

レイズドボタンごと移動させるとエラーは出ません。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のように修正することで動作します。

##修正ポイント

###1. class CustomSnackBar

  • SnackBarのコンストラクタをカスタマイズしている位置付けなので、コンストラクタを書きましょう。
  • buildはclass Homepageの中で呼ばれるものなので、こちらには書かないです。
  • contextはclass Homepage側で定義している変数なので、こちらで使う場合、コンストラクタで渡してあげるのがよいです。これにより、当初のエラー'content != null': is not true.が解消されます。
  • Widgetのコンストラクタをカスタマイズしている参考例: Flutterでウィジェット(widget)を継承したときのイベントがエラーになる

###2. class Homepage

  • 上記のエラーをとると、新たにScaffold.of() called with a context that does not contain a Scaffold.というエラーが、class Homepage側で発生します。そのまま読むとWidget build(BuildContext context)というScaffoldの外側のcontextのままでは、Scaffold.of()を呼んではいけないそうです。もとのコードはSnackBarの実装例でよくある形なので、以前は問題なかったのが最近エラーになったのかもしれません。
  • こちらの対処としてBuilderでラップする、というのが書かれており、それを適用したところエラーは無くなりました。
  • Builderでラップしてエラー回避している参考例: FlutterでToastを表示する

##修正済コード

Dart

1import 'package:flutter/material.dart'; 2 3void main() { 4 runApp(MyApp()); 5} 6 7class MyApp extends StatelessWidget { 8 9 Widget build(BuildContext context) { 10 return MaterialApp( 11 debugShowCheckedModeBanner: false, 12 title: '', 13 theme: ThemeData( 14 primarySwatch: Colors.blue, 15 ), 16 home: Homepage(), 17 ); 18 } 19} 20 21class Homepage extends StatelessWidget { 22 Widget build(BuildContext context) { 23 return Scaffold( 24 appBar: AppBar( 25 title: Text('テスト'), 26 ), 27 body: Builder(builder: (BuildContext context) { 28 return Center( 29 child: Column( 30 children: [ 31 RaisedButton( 32 child: Text('スナックバー表示'), 33 color: Colors.blue, 34 textColor: Colors.white, 35 onPressed: () { 36 final snackbar = CustomSnackBar(context); 37 Scaffold.of(context).showSnackBar(snackbar); 38 }, 39 ), 40 ], 41 ), 42 ); 43 }) 44 ); 45 } 46} 47 48class CustomSnackBar extends SnackBar { 49 CustomSnackBar(BuildContext context) : super( 50 content: Text('10秒後に消えます'), 51 action: SnackBarAction( 52 label: '閉じる', 53 onPressed: () { 54 Scaffold.of(context).removeCurrentSnackBar(); 55 }, 56 ), 57 duration: Duration(seconds: 10), 58 ); 59} 60

投稿2020/10/10 01:13

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HarukaNishiyama

2020/10/12 02:52

ありがとうございます。おかげさまで無事解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問