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

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

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

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

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

3022閲覧

Flutterの画面遷移にて、Undefined name 'context'と表示されてしまう問題を解決したい

flutter_labo

総合スコア110

Flutter

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

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

1グッド

0クリップ

投稿2020/02/25 09:48

onTapのところでエラーが出てしまいます…。

flutter

1import 'package:flutter/material.dart'; 2 3void main() { 4 runApp(MyApp()); 5} 6class MyApp extends StatefulWidget { 7 @override 8 _FirstRouteState createState() => _FirstRouteState(); 9} 10 11class _FirstRouteState extends State<MyApp> { 12 @override 13 Widget build(BuildContext context) { 14 return MaterialApp( 15 home: Scaffold( 16 appBar: AppBar( 17 title: const Text('StudySummary', 18 style: TextStyle( 19 fontWeight: FontWeight.bold, 20 fontStyle: FontStyle.italic, 21 fontSize: 18, 22 ),), 23 ), 24 body: ListView.builder( 25 itemBuilder: (BuildContext context, int index) { 26 return Padding( 27 padding: const EdgeInsets.only(top:8.0,left: 9.0), 28 child: EntryItem(data[index]), 29 ); 30 }, 31 itemCount: data.length, 32 ), 33 ), 34 ); 35 } 36} 37class Entry { 38 Entry(this.title, [this.children = const <Entry>[]]); 39 final String title; 40 final List<Entry> children; 41} 42final List<Entry> data = <Entry>[ 43 Entry( 44 '現代文', 45 ), 46 Entry( 47 '数学', 48 ), 49 Entry( 50 '英語', 51 ), 52 Entry( 53 '化学', 54 ), 55 Entry( 56 '物理', 57 ), 58 Entry( 59 '社会', 60 ), 61 Entry( 62 'その他', 63 ), 64]; 65 66// Displays one Entry. If the entry has children then it's displayed 67// with an ExpansionTile. 68class EntryItem extends StatelessWidget { 69 const EntryItem(this.entry); 70 71 final Entry entry; 72//expansionリストの一番下にいる子供達 73 74 Widget _buildTiles(Entry root) { 75 76 if (root.children.isEmpty) return Padding( 77 padding: const EdgeInsets.only(left:18.0), 78 child: ListTile( 79 80 //leading: const Icon(Icons.vpn_key), 81 leading: const Icon(Icons.book), 82 title: Text(root.title, 83 style: TextStyle( 84 fontWeight: FontWeight.bold, 85 fontSize: 18, 86 ),), 87 subtitle: Text("movie"), 88 onTap: () {Navigator.push( 89 context, 90 MaterialPageRoute(builder: (context) => SecondRoute()), 91 );} 92 93 ), 94 ); 95 //expansionリストの下から2番目にいる子供達 96 return Padding( 97 padding: const EdgeInsets.only(top:8.0,left:10.0), 98 child: ExpansionTile( 99 leading: const Icon(Icons.book), 100 key: PageStorageKey<Entry>(root), 101 title: Text(root.title, 102 style: TextStyle( 103 fontWeight: FontWeight.bold, 104 fontSize: 18, 105 ),), 106 subtitle: Text("unit"), 107 children: root.children.map(_buildTiles).toList(), 108 ), 109 ); 110 } 111 112 @override 113 Widget build(BuildContext context) { 114 return _buildTiles(entry); 115 } 116} 117//2ページ目 118class SecondRoute extends StatefulWidget { 119 @override 120 _SecondRouteState createState() => _SecondRouteState(); 121} 122以下、関係なさそうなので省略させていただきます。

恐らくですが、Widget build(BuildContext context)の扱い方を理解できていないのが原因だと考えております。ご回答、何卒よろしくお願いします

popobot👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

MaterialPageRouteにはcontextが必要なので、以下のように_buildTilesの引数にcontextを追加して、渡してあげる必要があります。

Widget build(BuildContext context) { return _buildTiles(context, entry); }
Widget _buildTiles(BuildContext context, Entry root) { // 省略 }

参考に動作確認した動くコードも載せておきます。

import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _FirstRouteState createState() => _FirstRouteState(); } class _FirstRouteState extends State<MyApp> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text( 'StudySummary', style: TextStyle( fontWeight: FontWeight.bold, fontStyle: FontStyle.italic, fontSize: 18, ), ), ), body: ListView.builder( itemBuilder: (BuildContext context, int index) { return Padding( padding: const EdgeInsets.only(top: 8.0, left: 9.0), child: EntryItem(data[index]), ); }, itemCount: data.length, ), ), ); } } class Entry { Entry(this.title, [this.children = const <Entry>[]]); final String title; final List<Entry> children; } final List<Entry> data = <Entry>[ Entry( '現代文', ), Entry( '数学', ), Entry( '英語', ), Entry( '化学', ), Entry( '物理', ), Entry( '社会', ), Entry( 'その他', ), ]; // Displays one Entry. If the entry has children then it's displayed // with an ExpansionTile. class EntryItem extends StatelessWidget { const EntryItem(this.entry); final Entry entry; //expansionリストの一番下にいる子供達 Widget _buildTiles(BuildContext context, Entry root) { if (root.children.isEmpty) return Padding( padding: const EdgeInsets.only(left: 18.0), child: ListTile( //leading: const Icon(Icons.vpn_key), leading: const Icon(Icons.book), title: Text( root.title, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), subtitle: Text("movie"), onTap: () { Navigator.push( context, MaterialPageRoute(builder: (context) => SecondRoute()), ); }), ); //expansionリストの下から2番目にいる子供達 return Padding( padding: const EdgeInsets.only(top: 8.0, left: 10.0), child: ExpansionTile( leading: const Icon(Icons.book), key: PageStorageKey<Entry>(root), title: Text( root.title, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), subtitle: Text("unit"), children: root.children.map((entry) => _buildTiles(context, entry)).toList(), ), ); } @override Widget build(BuildContext context) { return _buildTiles(context, entry); } } //2ページ目 class SecondRoute extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Container(), ); } }

投稿2020/02/25 10:49

popobot

総合スコア6586

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

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

flutter_labo

2020/02/25 11:24

無事解決できました!! 毎回お世話になって、、、 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問