[A.dart]で定義した変数値(genreID)を[B.dart]の中で使いたいです。
どのように設定すればよいのでしょうか?
[A.dart]の一部の計算を[B.dart]に外だししており、画面遷移ではありません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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, {@required this.name, this.value}); 9 final int id; 10 final String name; 11 final int value; 12 13 @override 14 bool operator ==(Object o) => 15 identical(this, o) || 16 (o is MyDataModel && o.id == id && o.name == name && o.value == value); 17 18 @override 19 int get hashCode => hashList([id, name, value]); 20 @override 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 @override 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 @override 55 _MyHomePageState createState() => _MyHomePageState(); 56} 57 58class _MyHomePageState extends State<MyHomePage> { 59 List<MyDataModel> _models = <MyDataModel>[]; 60 61 @override 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 @override 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 @override 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 @override 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, @required MyDataModel model}) 172 : _model = model, 173 super(key: key); 174 175 final _model; 176 177 @override 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総合スコア97
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。