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

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

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

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

Q&A

解決済

2回答

2724閲覧

switch文の画面遷移でエラーが出てしまう。

JohnWall

総合スコア1

Flutter

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

0グッド

0クリップ

投稿2022/07/16 08:01

編集2022/07/18 15:31

こんにちは、flutter初心者です。

BottomNavigationBarを遷移後の画面でも保持するため、
CupertinoTabBarを用いてswitch文で表示画面の切り替えをしたいと考えています。

しかし、以下のエラーが出てしまいビルドができない状態です。

Failed assertion: line 4531 pos 14: 'owner!._debugCurrentBuildTarget == this': is not true.

どのようにすれば、エラーなく画面遷移を行えますでしょうか?
皆さんのお知恵をお借りできましたら嬉しいです!

main.dart

1import 'package:flutter/material.dart'; 2import 'package:test001/screens/home_screen.dart'; 3import 'package:test001/screens/menu_screen.dart'; 4import 'package:test001/screens/profile_screen.dart'; 5import 'models/routes.dart'; 6 7void main() { 8 runApp(const MyApp()); 9} 10 11class MyApp extends StatelessWidget { 12 const MyApp({Key? key}) : super(key: key); 13 14 // This widget is the root of your application. 15 @override 16 Widget build(BuildContext context) { 17 return MaterialApp( 18 debugShowCheckedModeBanner: false, 19 title: 'Myapp', 20 theme: ThemeData( 21 primarySwatch: Colors.yellow, 22 textTheme: const TextTheme( 23 titleLarge: TextStyle( 24 fontSize: 20, 25 color: Colors. white, 26 fontWeight: FontWeight.w500, 27 ) 28 ) 29 ), 30 home: const HomeScreen(), 31 ); 32 } 33}

cupertino_bottom_navigation.dart

1import 'package:flutter/cupertino.dart'; 2import 'package:flutter/material.dart'; 3import 'package:test001/screens/home_screen.dart'; 4import 'package:test001/screens/menu_screen.dart'; 5import 'package:test001/screens/profile_screen.dart'; 6 7class BottomNavigation extends StatelessWidget { 8 const BottomNavigation({ 9 Key? key, 10 }) : super(key: key); 11 12 @override 13 Widget build(BuildContext context) { 14 return CupertinoTabScaffold( 15 tabBar: CupertinoTabBar( 16 items: const <BottomNavigationBarItem>[ 17 BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), 18 BottomNavigationBarItem(icon: Icon(Icons.menu), label: 'Menu'), 19 BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Profile'), 20 ], 21 ), 22 tabBuilder: (BuildContext context, int index) { 23 switch (index) { 24 case 0: 25 return CupertinoTabView( 26 builder: (context) { 27 return const CupertinoPageScaffold( 28 child: HomeScreen(), 29 ); 30 }, 31 ); 32 case 1: 33 return CupertinoTabView( 34 builder: (context) { 35 return const CupertinoPageScaffold( 36 child: MenuScreen(), 37 ); 38 }, 39 ); 40 case 2: 41 return CupertinoTabView(builder: (context) { 42 return const CupertinoPageScaffold( 43 child: ProfileScreen(), 44 ); 45 }); 46 default: 47 return CupertinoTabView( 48 builder: (context) { 49 return const CupertinoPageScaffold( 50 child: HomeScreen(), 51 ); 52 }, 53 ); 54 } 55 }); 56 } 57}

home_screen.dart

1import '../widgets/cupertino_bottom_navigation.dart'; 2import 'package:flutter/material.dart'; 3 4class HomeScreen extends StatefulWidget { 5 const HomeScreen({Key? key}) : super(key: key); 6 7 @override 8 _HomeScreenState createState() => _HomeScreenState(); 9} 10 11class _HomeScreenState extends State<HomeScreen> { 12 @override 13 Widget build(BuildContext context) { 14 return Scaffold( 15 backgroundColor: Colors.yellow, 16 appBar: AppBar( 17 leading: const Icon(Icons.person), 18 title: Text('Your Name'), 19 ), 20 bottomNavigationBar: const BottomNavigation()); 21 } 22}

menu_screen.dart

1import 'package:flutter/material.dart'; 2 3class MenuScreen extends StatefulWidget{ 4 const MenuScreen ({ Key? key }) : super(key: key); 5 6 @override 7 _MenuState createState() => _MenuState(); 8} 9 10class _MenuState extends State<MenuScreen>{ 11 @override 12 Widget build(BuildContext context) => Scaffold( 13 appBar:AppBar(title: Text('メニューページ'),), 14 ); 15 }

profile_screen.dart

1import 'package:flutter/material.dart'; 2 3class ProfileScreen extends StatefulWidget{ 4 const ProfileScreen({ Key? key }) : super(key: key); 5 6 @override 7 _ProfileState createState() => _ProfileState(); 8} 9 10class _ProfileState extends State<ProfileScreen>{ 11 @override 12 Widget build(BuildContext context) => Scaffold( 13 appBar:AppBar(title: Text('プロフィールページ'),), 14 ); 15 }

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

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

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

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

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

JohnWall

2022/07/16 15:02

ta.fuさんにご指摘いただいた箇所の修正をさせていただきました。 しかし、以前として同じエラーメッセージが表示されている状態です。 全体のコードを記載していますので、もし怪しい箇所などありましたら教えてもらえますと助かります!
guest

回答2

0

ベストアンサー

https://api.flutter.dev/flutter/cupertino/CupertinoTabScaffold-class.html
CupertinoTabScaffoldの定義先のドキュメントコメントにサンプルコードがありましたので、それを使ったらこのようなものが出来ました。

一応、BottomNavigationBarを遷移後の画面でも保持するため、
CupertinoTabBarを用いてswitch文で表示画面の切り替えができていると思います。

Use CupertinoTabView as the root widget of each tab to support tabs with parallel navigation state and history.
各タブのルートウィジェットとしてCupertinoTabViewを使用して、並列ナビゲーションの状態と履歴を持つタブをサポートします。

エラーの原因ははっきりとはわからないですが、上記のような説明もあるので、CupertinoTabViewは(使うのであれば)ルートに設置する必要があるようです。

あと他の回答者様のご指摘の通り、無限ループのようになっているように見えますのでそれかと思います。

import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; void main() { runApp( MaterialApp( home: MyApp(), ), ); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return CupertinoTabScaffold( tabBar: CupertinoTabBar( items: const <BottomNavigationBarItem>[ BottomNavigationBarItem( icon: Icon(Icons.looks_one,), ), BottomNavigationBarItem( icon: Icon(Icons.looks_two), ), BottomNavigationBarItem( icon: Icon(Icons.looks_3), ), // ... ], ), tabBuilder: (BuildContext context, int index) { return CupertinoTabView( builder: (BuildContext context) { return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( middle: Text('Page 1 of tab $index'), ), child: Builder( builder:(context,){ switch(index){ case 0: return HomeScreen(); case 1: return MenuScreen(); case 2: return ProfileScreen(); default: return HomeScreen(); } }, ), ); }, ); }, ); } } class HomeScreen extends StatefulWidget { const HomeScreen({Key? key}) : super(key: key); @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { @override Widget build(BuildContext context) { return Container( color:Colors.green, child:Center(child:Text('home')), ); } } class MenuScreen extends StatefulWidget{ const MenuScreen ({ Key? key }) : super(key: key); @override _MenuState createState() => _MenuState(); } class _MenuState extends State<MenuScreen>{ @override Widget build(BuildContext context) => Scaffold( appBar:AppBar(title: Text('メニューページ'),), ); } class ProfileScreen extends StatefulWidget{ const ProfileScreen({ Key? key }) : super(key: key); @override _ProfileState createState() => _ProfileState(); } class _ProfileState extends State<ProfileScreen>{ @override Widget build(BuildContext context) => Scaffold( appBar:AppBar(title: Text('プロフィールページ'),), ); }

投稿2022/07/18 00:18

moriman

総合スコア615

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

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

JohnWall

2022/07/18 06:31

morimanさん ご回答ありがとうございます! 添付いただいたソースコードをもとに再度見直してみます!
guest

0

関数及びウィジェットの流れを追っていくと、以下の様になっていることが分かります。

main->MyApp->HomeScreen->BottomNavigation->HomeScreen()->...

生成ウィジェットが循環しているんです。なのでその循環を切らないといけません。
とりあえずBottomNavigation内のHomeScreen()呼び出しをText("hoge")などに変えることで動きます。

後呈示するエラーメッセージが不足しています。
まずStack Overflowと表示され、提示されたエラーのメッセージが表示されていました。
今回の件だとStack Overflowの方が重要です。
このエラーで、大きなデータを取得しようとしていたのか、もしくは関数呼び出しが循環しているのか判断できます。それを元にコードを見ればわかる内容のものです。(ただFlutter/Dartだとスタックに大量なデータを積むような実装は難しいのでほぼ呼び出しの循環が発生していると絞れます)


switch文のcase 3はcase 2じゃないでしょうか。

後、switchにdefaultの指定がないんでビルドが通らないのだと思います。
indexがintで0,1,3のケースしかreturnでWidgetを返しておらず、それ以外のケースでreturnがnullになるから。

以下の様なエラーメッセージが出てませんか。

The body might complete normally, causing 'null' to be returned, but the return type, 'Widget', is a potentially non-nullable type.
Try adding either a return or a throw statement at the end. dartbody_might_complete_normally

実行可能な全ソースがないんで、コードを見た限りの判断ですが。

投稿2022/07/16 12:57

編集2022/07/16 21:21
ta.fu

総合スコア1664

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

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

JohnWall

2022/07/16 15:05

ta.fuさん コメントありがとうございます! ただ、indexの数値修正、defaultの追加を行なっても変わらずに同じエラーが表示され ビルドできない状態です。。。 ソース全文を追記させていただいたので、よろしければ再度ご確認いただければと思います。。。!
JohnWall

2022/07/18 06:30

断片的な情報しか共有できておらず申し訳ありません。 HomeScreen箇所を修正することでビルドができるようになりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問