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

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

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

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Flutter

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

Dart

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

Q&A

解決済

1回答

1029閲覧

Flutter 別ファイルのクラスを参照できない

t_flutter

総合スコア7

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Flutter

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

Dart

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

0グッド

0クリップ

投稿2023/02/25 02:03

実現したいこと

main.dartファイル内の_MyHomePageStateクラスに記述したメソッドを
home.dartファイル内の_MyHome内で使いたいのですが上手くいきません。
どこか根本的な部分を理解できていないような気がしますのでアドバイスいただきたいです。

前提

・main.dart内でimport 'home.dart';と記述している
・main.dartとhome.dartは同一フォルダ内の同じ階層にある
・_MyHome内で_MyHomePageStateクラスをインスタンス化して使用したい
・vscodeを使っておりクラス名を入力したときに候補が表示されるが、同一ファイル内の
クラス目の候補は表示されるが、別ファイルのクラス名を入力しても認識されない。

該当のソースコード

main.dart

1//だいぶ省略しています 2import 'package:flutter/material.dart'; 3import 'home.dart'; 4 5class MyHomePage extends StatefulWidget { 6 const MyHomePage({super.key}); 7 8 @override 9 State<MyHomePage> createState() => _MyHomePageState(); 10} 11 12class _MyHomePageState extends State<MyHomePage> { 13 //画像の複数選択モードのON/OFFの状態を保持する変数 14 bool _buttonFlag = false; 15 16 **//home.dartから使いたいメソッド** 17 void _pickImages() { 18 setState(() { 19 _buttonFlag = true; 20 }); 21 } 22

home.dart

1class Home extends StatefulWidget { 2 const Home({super.key}); 3 @override 4 State<Home> createState() => _MyHome(); 5} 6 7class _MyHome extends State<Home> { 8 9**//main.dartのMyHomePageStateクラスをインスタンス化** 10**//ここで_MyHomePageStateがvscode上で認識されない。** 11_MyHomePageState pickImage = _MyHomePageState(); 12 13 @override 14 Widget build(BuildContext context) { 15 return Scaffold( 16 appBar: AppBar( 17 backgroundColor: Colors.black, 18 leading: IconButton( 19 icon: Icon(Icons.add), 20 onPressed: () => setState(() { 21 22 **//ここでメソッドを使用したい** 23 pickImage.pickImages(); 24 25 }), 26 ), 27 leadingWidth: 20, 28 title: const Text("料理を選ぶ"), 29 actions: <Widget>[ 30 IconButton( 31 icon: Icon(Icons.add), 32 onPressed: () { 33 showDialog( 34 context: context, 35 builder: (context) => const CustomDialogBox(), 36 ); 37 }, 38 ), 39 const Center( 40 child: Padding( 41 padding: EdgeInsets.all(5.0), 42 child: Text( 43 '料理を登録', 44 style: TextStyle(fontSize: 20), 45 ), 46 )) 47 ], 48 ),

試したこと

・vscode再起動

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

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

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

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

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

guest

回答1

0

ベストアンサー

import文は問題無いように見えます。こちらでは実際それで別ファイルのクラスを読み込めます。

具体的に何をやりたいのかに関する情報が足りないので推測するしかないのですが、よくあるケースとして、
MyHomePageがHomeの上位ウィジェット(ウィジェットツリー上の先祖ウィジェット)であり、HomeのAppBarのIconButtonを押したときにMyHomePageの_buttonFlagの値を変更させたいのなら、下記のように引数で_pickImagesを渡して、Homeでそれを呼び出す(俗に言うバケツリレー)必要があります。
(あるいは状態管理パッケージを使うか。)

そうじゃないということなら、具体的に何をやりたいのかを伝えるために必要なソースコードを示すか、日本語で具体的に示すか、少なくともどちらかが必要です。

main.dart

1import 'package:flutter/material.dart'; 2 3import 'home.dart'; 4 5void main() { 6 runApp( 7 MyHomePage(), 8 ); 9} 10 11class MyHomePage extends StatefulWidget { 12 const MyHomePage({Key? key}) : super(key: key); 13 14 @override 15 State<MyHomePage> createState() => _MyHomePageState(); 16} 17 18class _MyHomePageState extends State<MyHomePage> { 19 bool _buttonFlag = false; 20 21 //home.dartから使いたいメソッド** 22 void _pickImages() { 23 setState(() { 24 _buttonFlag = true; 25 }); 26 } 27 28 @override 29 Widget build(BuildContext context) { 30 return MaterialApp( 31 //home: HomePage(), 32 home: Home( 33 stateSetter: _pickImages, 34 ), 35 ); 36 } 37}

home.dart

1import 'package:flutter/material.dart'; 2 3class Home extends StatefulWidget { 4 const Home({ 5 Key? key, 6 required this.stateSetter, 7 }) : super(key: key); 8 9 final Function stateSetter; 10 11 @override 12 State<Home> createState() => _HomeState(); 13} 14 15class _HomeState extends State<Home> { 16 @override 17 Widget build(BuildContext context) { 18 return Scaffold( 19 appBar: AppBar( 20 leading: IconButton( 21 icon: Icon(Icons.add), 22 onPressed: () => setState(() { 23 //_HomeStateの状態をセットするためのコード 24 widget.stateSetter(); 25 }), 26 ), 27 ), 28 ); 29 } 30}

投稿2023/02/25 03:21

moriman

総合スコア615

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

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

t_flutter

2023/02/25 12:23

morimanさん、ご回答ありがとうございます。おっしゃる通りでMyHomePageがHomeの上位ウィジェットでありHomeクラス内のAppBarのIconButtonを押下時にMyHomePageのFlagを変化させてsetStateでUIを更新するということをやろうとしていました。おかげさまでバケツリレー方式を使って達成することが出来ました。今回は状態管理パッケージを使わずに(まだ使ったことがないですが、、、)実装しようとしていましたがまずは状態管理パッケージを使用しない場合にどのようなアプローチで実装すればよいかを体験することが出来て勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問