Andoroid Studioで、Flutter(Dart)を用いて簡単なアプリを作っています。
サイトなどを参考にして、
画面遷移後、すでに前のページで作成済みのデータベースのテーブルからレコードを取得して、その値をTextに表示させたいのですが、表題の通り、LateInitializatioinErrorが出ます。
自分としては、「 late Map<String,dynamic>? gotMap;」の記述で初期化をしているつもりなのですが、何がいけないのでしょうか。
実現したいこと
すでに作成済みのデータベースのテーブルからレコードを取得してその値をTextに表示させたい。
発生している問題・エラーメッセージ
LateInitializationError: Field 'getedMap' has not been initialized.
該当のソースコード
表示させたいページ。initState()でメソッド呼び出しをしました。
class WorkingState extends StatefulWidget { final int? id; final int? time; const WorkingState({Key? key, required this.id, required this.time}) : super(key: key); @override State<WorkingState> createState() => _WorkingStateState(id,time); } class _WorkingStateState extends State<WorkingState>{ final int? _id; final int? _time; _WorkingStateState(this._id, this._time); late String todo; //これは初期化ではない? late Map<String,dynamic>? gotMap; @override void initState() { super.initState(); //メソッドの呼び出し getNogoMap(); todo = gotMap!["TODO"]; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('hello appbar!'), ), body: Center( child: Column( children: [ const Text("やること"), Text(todo?? ""), ], ), ), ); } //DbHelperを利用して、データベースからレコードをMapを取得しようとしています。 getNogoMap() async{ gotMap = await DbHelper.instance.getMap(_id); } }
DbHelperクラスのメソッド
//データベースからレコードを取得。レコードは1件なので、中身をMapにして返しています。 Future<Map<String, dynamic>> getNogoMap(int? id) async { final db = await database; List<Map<String,dynamic>> results = await db.query("NO_GO_RECORDS", where: "_id=?", whereArgs: [id]); Map<String, dynamic> map = results[0]; return map; }
試したこと
上記記述の変数の初期化のところで、
late Map<String,dynamic>? gotMap;
↑これを、↓のように変えて
late Future<Map<String,dynamic>>? gotMap;
さらに、メソッドの呼び出しのところで、
getNogoMap();
↑これを、↓のように変えて
gotMap = getNogoMap();
メソッドの方を、
Future<Map<String,dynamic>> getNogoMap() async{ Map<String,dynamic> map; map = await DbHelper.instance.getNogoMap(_id); return map; }
としますと、Mapから値を取り出すところで
下記エラーメッセージが出てコンパイルが通りません。
The operator '[]' isn't defined for the type 'Future<Map<String, dynamic>>'.
正直言って、非同期処理を行った場合の戻り値の型の意味が分かっていません。
そもそも Future型とはなんなのでしょうか?
また、本やサイトをみると、データベースから取得したListをクラスのリストにして戻しているようなのですが、そうしないとだめなのでしょうか。
もう、考えれば考えるほど分からなくなってきます。
どのようにしたら意図したとおりの動きをしてくれるのか、ご教示いただけたら幸いです。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/11/06 07:19