🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flutter

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

Dart

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

Q&A

1回答

5044閲覧

【Flutter】クラス間で値を共有したい

k2yk81

総合スコア4

Flutter

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

Dart

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

0グッド

0クリップ

投稿2020/12/28 08:06

編集2020/12/28 08:17

[A.dart]で定義した変数値(genreID)を[B.dart]の中で使いたいです。
どのように設定すればよいのでしょうか?
[A.dart]の一部の計算を[B.dart]に外だししており、画面遷移ではありません。

図の???の箇所の方法についての質問になります。

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

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

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

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

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

guest

回答1

0

質問のつくりかたについて

とりあえず聞いてみるというのは、分からないときに何も質問しないよりは大分ましですが

質問の内容が全くわからないので、なにか具体的なコードを書いて実現したいことを説明してください。

また、その目的も合わせて書かれていると良いです。

そもそも、目的のために実現したいと思っている内容が

やる必要がないことだったり、
実現が出来たとしても、問題がある方法なのでやるべきでなかったりすることだったり、
その開発の文化ではやらない実装方法なので避けるべきだったり、

などの判断ができ、意味のある助言ができるようになります。

1)目的、2)仮定している実現方法、3)実際に起きた問題・課題、4)問題や課題について自分で調べた内容・想像できる範囲の真因、5)環境と再現方法

を整理して質問するようになると回答者が答えやすくなり、仮定の当たり外れからどんな点について理解が足りてなかったのかが分かります。

また、質問を作る過程で上記を整理する際の気づきが問題を解決してしまうこともあります。
その場合は、なにかしらのアウトプットとして残しておくと後々、自分や同じ勉強をしている人の役に立つでしょう。

今回の質問について

[A.dart]や[B.dart]という風に例示されていますが、dartにおいては複数のクラスを同じファイルに定義できたり、継承やMixInにより複数のファイルにまたがって一つのクラスを定義できたりします。

ファイルがいくつあるのかはクラスの構造にあまり関係がないので、dartについて質問する際にはクラス単位で説明するようにしてください。

一般的なFlutterでのアプリの作りについて

それはさておき
以下、想像で回答をしておきますが

図を見ると、なにかの関数がWidgetを返しているように見えますが、FlutterではWidgetのサブクラス以外がWidgetとして使用されるケースはほぼないと思います。
なので、左右とも何かしらのWidgetに見えます。

しかし、

[A.dart]の一部の計算を[B.dart]に外だししており、画面遷移ではありません。

とあるので、図はあまり関係なく
何かしら時間のかかる計算や外部からの値の取得、計算タイミングをずらしたい事情などにより、状態が変わるDataClassやDomainClassのインスタンスをフィールドとして保持しているWidgetが一つある状態のような気がします。

それであれば、いくつかあるよく使われているFlutterの状態管理の手法を一つ選択して実装するようにします。
よく使われるのか以下の手法です。

以下は、StatefulWidgetを使用した任意のモデルを作成し、リストに追加できるUIの例です。

dart

1import 'package:flutter/material.dart'; 2 3void main() { 4 runApp(MyApp()); 5} 6 7class MyDataModel { 8 const MyDataModel._(this.id, { this.name, this.value}); 9 final int id; 10 final String name; 11 final int value; 12 13 14 bool operator ==(Object o) => 15 identical(this, o) || 16 (o is MyDataModel && o.id == id && o.name == name && o.value == value); 17 18 19 int get hashCode => hashList([id, name, value]); 20 21 String toString() => 'MyDataModel(id: $id, name: $name, value: $value)'; 22} 23 24class MyDataRepository { 25 static final List<MyDataModel> _models = <MyDataModel>[]; 26 static int _seqNum = 0; 27 Future<int> get nextId async => _seqNum; 28 Future<List<MyDataModel>> get models async => _models; 29 Future<MyDataModel> create(String name, {int value}) async => 30 MyDataModel._(_seqNum++, name: name, value: value ?? 0); 31 Future<void> add(MyDataModel model) async => _models.add(model); 32 // Future<bool> remove(MyDataModel model) async => _models.remove(model); 33 // Future<int> count() async => _models.length; 34} 35 36class MyApp extends StatelessWidget { 37 38 Widget build(BuildContext context) { 39 return MaterialApp( 40 title: 'Flutter Demo', 41 theme: ThemeData( 42 primarySwatch: Colors.blue, 43 ), 44 home: MyHomePage(), 45 ); 46 } 47} 48 49class MyHomePage extends StatefulWidget { 50 MyHomePage({Key key}) : super(key: key); 51 52 final MyDataRepository repos = MyDataRepository(); 53 54 55 _MyHomePageState createState() => _MyHomePageState(); 56} 57 58class _MyHomePageState extends State<MyHomePage> { 59 List<MyDataModel> _models = <MyDataModel>[]; 60 61 62 void initState() { 63 super.initState(); 64 widget.repos.models.then((models) { 65 _models = models; 66 }); 67 } 68 69 Future<void> updateModels() async { 70 final models = await widget.repos.models; 71 setState(() { 72 _models = models; 73 }); 74 } 75 76 77 Widget build(BuildContext context) => Scaffold( 78 appBar: AppBar( 79 title: Text('Update State Async Demo'), 80 ), 81 body: SingleChildScrollView( 82 child: Column( 83 crossAxisAlignment: CrossAxisAlignment.center, 84 children: <Widget>[ 85 Container( 86 color: Colors.amber, 87 padding: EdgeInsets.all(15), 88 child: Center(child: Text('Count:${_models.length}'))), 89 Container( 90 color: Colors.white, 91 padding: EdgeInsets.all(15), 92 child: _AddModelForm(onUpdate: updateModels)), 93 ..._models.map((model) => _MyModelWidget(model: model)) 94 ])), 95 ); 96} 97 98class _AddModelForm extends StatefulWidget { 99 _AddModelForm({Key key, this.onUpdate}) : super(key: key); 100 final MyDataRepository repos = MyDataRepository(); 101 final void Function() onUpdate; 102 103 104 State<StatefulWidget> createState() => _AddModelFormState(); 105} 106 107class _AddModelFormState extends State<_AddModelForm> { 108 int _nextId = 0; 109 110 void initState() { 111 super.initState(); 112 widget.repos.nextId.then((nextId) => _nextId = nextId); 113 } 114 115 void updateId() async { 116 final int nextId = await widget.repos.nextId; 117 setState(() { 118 _nextId = nextId; 119 }); 120 } 121 122 123 Widget build(BuildContext context) { 124 final TextEditingController nameCtrl = TextEditingController(); 125 final TextEditingController valueCtrl = TextEditingController(); 126 return Container( 127 child: Row( 128 children: <Widget>[ 129 Flexible( 130 flex: 1, 131 child: Row(children: <Widget>[ 132 Flexible(flex: 2, child: const Text('id:')), 133 Flexible(flex: 1, child: Center(child: Text('$_nextId'))), 134 ])), 135 Flexible( 136 flex: 4, 137 child: Row(children: <Widget>[ 138 Flexible(child: const Text('name:')), 139 Flexible(child: TextField(controller: nameCtrl, maxLength: 8)), 140 ])), 141 Flexible( 142 flex: 3, 143 child: Row(children: <Widget>[ 144 Flexible(child: const Text('value:')), 145 Flexible( 146 child: TextField( 147 controller: valueCtrl, 148 maxLength: 4, 149 keyboardType: TextInputType.number)), 150 ])), 151 Flexible( 152 flex: 2, 153 child: ElevatedButton( 154 child: Text('Add'), 155 onPressed: () async { 156 final MyDataModel model = await widget.repos 157 .create(nameCtrl.text, value: int.parse(valueCtrl.text)); 158 await widget.repos.add(model); 159 nameCtrl.clear(); 160 valueCtrl.clear(); 161 updateId(); 162 widget.onUpdate(); 163 }, 164 )), 165 ], 166 )); 167 } 168} 169 170class _MyModelWidget extends StatelessWidget { 171 const _MyModelWidget({Key key, MyDataModel model}) 172 : _model = model, 173 super(key: key); 174 175 final _model; 176 177 178 Widget build(BuildContext context) => Container( 179 margin: EdgeInsets.only(top: 8), 180 padding: EdgeInsets.all(8), 181 color: Colors.white, 182 height: 48, 183 child: Row( 184 children: <Widget>[Text('$_model')], 185 )); 186}

Flutterで状態管理が必要なアプリを作る際に必要な基本的の構造は入っていると思いますので、上記のコードについて、何が起こっているのかが全部わかっていれば大抵のことはできるはずです。

他の状態管理の手法も基本的には上記の応用になります。

投稿2020/12/31 05:00

編集2020/12/31 05:06
aya-eiya

総合スコア97

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問