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

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

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

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

タブ

コンテンツの上下左右に参照用のメニューを設けることで、複数の要素やページの表示を可能にするユーザーインターフェイスパターンのこと。メニューをクリックすると、一つの要素が可視化され、他の要素は見えなくなる。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Q&A

解決済

1回答

1313閲覧

【Flutter】タブから画面遷移

GoodDay

総合スコア64

Flutter

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

タブ

コンテンツの上下左右に参照用のメニューを設けることで、複数の要素やページの表示を可能にするユーザーインターフェイスパターンのこと。メニューをクリックすると、一つの要素が可視化され、他の要素は見えなくなる。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

0グッド

0クリップ

投稿2020/05/28 01:47

編集2020/05/28 01:49

Flutterでタブから画面遷移をしたい

デモページ

Flutterで上部に2つのタブを作成しました。
そのうちの左のページのボタンを押して、画面遷移をさせたいと考えております。
しかし、結果は上手くいかず、以下のようなエラーが表示されました。

Fluter

1// 表示されたエラー 2Navigator operation requested with a context that does not include a Navigator.

Fluter

1コードimport 'package:flutter/material.dart'; 2 3// 最初に呼び出される関数(MyApp関数) 4void main() { 5 runApp(TabBarDemo()); 6} 7 8class TabBarDemo extends StatelessWidget { 9 @override 10 // StatelessWidget を継承する場合は build する 11 Widget build(BuildContext context) { 12 return MaterialApp( 13 title: 'Flutter Demo', 14 theme: ThemeData( 15 primarySwatch: Colors.blue, 16 ), 17 18 // home は最初に表示するページ 19 // DefaultTabController を利用すると、自分で TabController を管理する必要がないので簡単にタブを作成できる 20 home: DefaultTabController( 21 length: 2, 22 // Scaffold を使うことで、 appBar を利用できる 23 child: Scaffold( 24 appBar: AppBar( 25 // appBar の bottomの部分 に作成 26 bottom: TabBar( 27 28 // 上のタブ 29 tabs: [ 30 Tab(text: ('Hello')), 31 Tab(icon: Icon(Icons.directions_run)), 32 ], 33 ), 34 title: Text('Tabs Demo'), 35 ), 36 body: TabBarView( 37 38 // タブの画面 39 children: [ 40 // 1ページ目 41 Center( 42 child: Column( 43 mainAxisAlignment: MainAxisAlignment.center, 44 children: <Widget>[ 45 Text('このボタンを押して、画面遷移したい'), 46 RaisedButton( 47 child: Text('新しいページへ'), 48 color: Colors.orange, 49 textColor: Colors.white, 50 onPressed: () { 51 Navigator.push( 52 context, 53 MaterialPageRoute(builder: (context) => NewPage()), 54 ); 55 }, 56 ), 57 ], 58 ), 59 ), 60 61 // 2ページ目 62 Icon(Icons.directions_run), 63 ], 64 ), 65 ), 66 ), 67 ); 68 } 69} 70 71// 左のタブのボタンから遷移するページ 72class NewPage extends StatelessWidget { 73 @override 74 Widget build(BuildContext context) { 75 return Scaffold( 76 appBar: AppBar( 77 title: Text("新しいページ"), 78 ), 79 body: Center( 80 child: RaisedButton( 81 onPressed: () { 82 Navigator.pop(context); 83 }, 84 child: Text('戻る'), 85 ), 86 ), 87 ); 88 } 89}

試したこと

公式サイトを参考にページ遷移を実装した.
エラーを確認し、ネットで調べた.

最後に

ご教示いただけたら幸いです。
どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DefaultTabControllerBuilderで囲んであげるか、
DefaultTabController全体を別Widgetに切り出してあげればよいです。

理由は、、、以下が参考になります。(字幕を翻訳すれば日本語で理解できます)
Builder (Flutter Widget of the Week) - YouTube

補足
エラーメッセージはNavigator.pushで、Navigatorが見つからないといっています。
NavigatorオブジェクトはMaterialApp内で生成されますが、
質問のコードだとMaterialAppのContextへ辿ることができないです。


Builderで囲む

Dart

1 home: Builder( 2 builder: (context) => DefaultTabController(

別Widgetに切り出す

Dart

1class TabBarDemo extends StatelessWidget { 2 3 Widget build(BuildContext context) { 4 return MaterialApp( 5 title: 'Flutter Demo', 6 theme: ThemeData( 7 primarySwatch: Colors.blue, 8 ), 9 home: TabPage(), 10 ); 11 } 12} 13 14class TabPage extends StatelessWidget { 15 16 Widget build(BuildContext context) { 17 return DefaultTabController( 18 ~略~ 19 } 20}

投稿2020/05/28 02:30

編集2020/05/28 02:37
satokei

総合スコア1217

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

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

GoodDay

2020/05/28 02:51

ありがとうございます! contextに対する理解をもっと深めていこうと思います。 @satokeiさんのご回答、とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問