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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Dart

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

Q&A

解決済

1回答

371閲覧

BottomNavigationBarでタブ選択時に他のファイルのクラスに値を渡せない

KentarouHayashi

総合スコア23

Flutter

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Dart

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

0グッド

0クリップ

投稿2022/08/24 11:20

編集2022/08/24 11:23

前提

ログインをしてログイン後はホームとアカウントの2画面があります。
BottomNavigationBarを使用して画面の切り替えを行います。
ログイン時にログイン情報を取得し、アカウント画面でログイン情報を表示させたいと思ってます。

実現したいこと

・他のファイルのクラスに値を渡したして渡したデータを画面上に表示させたい。

※現在お試しでtest2のみを送ろうとしておりますが実際はほかのデータも送る予定です。

発生している問題・エラーメッセージ

①Error: Can't access 'this' in a field initializer to read 'test2'. Account(user_id2: test2), ②Error: Undefined name 'test2'. Account(user_id2: test2), ※①が解消されれば②も解消されるはず。

該当のソースコード

Dart

1import 'package:flutter/material.dart'; 2import 'account.dart'; 3import 'home.dart'; 4// [Themelist] インスタンスにおける処理。 5class Appmain extends StatelessWidget{ 6 final String? user_id;//null許容で変数定義 7 final String? imgURL;//null許容で変数定義 8 final String? user_email;//null許容で変数定義 9 final String? user_name;//null許容で変数定義 10 const Appmain({Key? key, this.user_id, this.imgURL, this.user_email, this.user_name}) : super(key: key); 11 12 Widget build(BuildContext context) { 13 print(user_name); 14 return Scaffold ( 15 body: MyTop(test: user_name), 16 ); 17 } 18} 19 20// ignore: must_be_immutable, use_key_in_widget_constructors 21class MyTop extends StatefulWidget{ 22 final String? test; 23 const MyTop({Key? key, this.test}) : super(key: key); 24 25 // ignore: no_logic_in_create_state 26 _MyTop2 createState() => _MyTop2(test2: test); 27} 28class _MyTop2 extends State<MyTop> { 29 final String? test2; 30 _MyTop2({this.test2}); 31 static const _screens = [ 32 Home(), 33 Account(user_id2: test2), 34 ]; 35 int _selectedIndex = 0; 36 37 void _onItemTapped(int index) { 38 setState(() { 39 _selectedIndex = index; 40 }); 41 } 42 43 Widget build(BuildContext context) { 44 print(test2); 45 return Scaffold ( 46 body: _screens[_selectedIndex], 47 bottomNavigationBar: BottomNavigationBar( 48 currentIndex: _selectedIndex, 49 onTap: _onItemTapped, 50 items: const <BottomNavigationBarItem>[ 51 BottomNavigationBarItem(icon: Icon(Icons.home), label: 'ホーム'), 52 BottomNavigationBarItem(icon: Icon(Icons.person), label: 'アカウント'), 53 ], 54 type: BottomNavigationBarType.fixed, 55 ) 56 ); 57 } 58}

試したこと

・printにて値を表示してみたら表示はされたので変数自体に値は入っていそう。
・Account(user_id2: test2),のところで変数のtest2ではなく任意の文字列を入れるとエラーはなくなり他のファイルにも値を渡せた。

補足情報(FW/ツールのバージョンなど)

OS:Windows11
IDE:Android Studio
Flutter 3.0.4
firebase_auth: ^3.6.3
firebase_core: ^1.20.1
cloud_firestore: ^3.4.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

直すとしたら以下の様な感じかな。

  • MyTopの情報を_MyTop2で使う場合、_MyTop2ではwidget.~という形で参照できる。
    そのため_MyTop2に情報を渡すような書き方はしない。
  • createStateのリターンはState<MyTop>
  • static const _screensをfinal _screensにする。
    staticはクラス変数になるのでインスタンス変数を参照することはできない。
    また生成されるのも基本1回だけなので、上位側でtestの中身が変わった場合への対応ができない。
  • static const _screensをWidgetを返す関数化する。(修正)
    finalだとwidgetが使えなかったようですね。失敗です。
    build内からの関数呼び出しで利用することでたぶんうまくいくと思います。
    またタブの数が3以上に増えた場合はif文ではなくswitch文を使えばいいと思います。

dart

1class MyTop extends StatefulWidget { 2 final String? test; 3 const MyTop({Key? key, this.test}) : super(key: key); 4 5 State<MyTop> createState() => _MyTop2(); 6} 7 8class _MyTop2 extends State<MyTop> { 9 Widget _screens() { 10 if (_selectedIndex == 0) { 11 return const Home(); 12 } else { 13 return Account(user_id2: widget.test); 14 } 15 } 16 17 int _selectedIndex = 0; 18 19 void _onItemTapped(int index) { 20 setState(() { 21 _selectedIndex = index; 22 }); 23 } 24 25 26 Widget build(BuildContext context) { 27 print(widget.test); 28 return Scaffold( 29 body: _screens(), 30 bottomNavigationBar: BottomNavigationBar( 31 currentIndex: _selectedIndex, 32 onTap: _onItemTapped, 33 items: const <BottomNavigationBarItem>[ 34 BottomNavigationBarItem(icon: Icon(Icons.home), label: 'ホーム'), 35 BottomNavigationBarItem(icon: Icon(Icons.person), label: 'アカウント'), 36 ], 37 type: BottomNavigationBarType.fixed, 38 )); 39 } 40}

投稿2022/08/24 23:58

編集2022/08/25 11:37
ta.fu

総合スコア1676

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

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

KentarouHayashi

2022/08/25 09:42

ご回答ありがとうございます。 ご教示いただいた内容で実装してみたのですが、 Account(user_id2: widget.test),の部分の「widget」でエラーが出てしまいます。。。 エラー内容は以下となります。 error: The instance member 'widget' can't be accessed in an initializer. ネットでいろいろ探してみたのですがなかなか解決できず。。。 何かいいアイディアがございましたらご教示いただけますと幸いです。
KentarouHayashi

2022/08/25 13:34

ご回答ありがとうございます。 す、すごい!!!いろんなやり方があるのですね。。。 まだまだ勉強して理解しないといけないところは多いのですが、ご教示いただいた内容で、 アカウントページにFirebaseから引っ張ってきたデータを表示させることができました。 いつもありがとうございますmm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問