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

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

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

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

Q&A

解決済

2回答

431閲覧

flutterでのアプリ立ち上げ時のデータ取得

Nanmotsu

総合スコア22

Flutter

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

0グッド

0クリップ

投稿2023/02/23 03:32

実現したいこと

flutterでアプリ立ち上げ時csvファイルを取得して、
ListViewで表示したい

概要

flutterで非同期通信をしてデータを取得して、ウェジットに反映させたいのですが、
「初期化していない!」というメッセージが出てしまします。
解決策を調べてみたのですが、どれもいまいちうまくいかなかったので質問いたします

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

エラー

dart

1 2//load_csv.dart 3 4import 'package:flutter/services.dart'; 5 6Future<List> getTitleCsvData(String path) async { 7 8 String csv = await rootBundle.loadString(path); 9 String titledata = csv.split("\n")[0]; 10 11 List titleList = titledata.split(','); 12 13 return titleList; 14 15} 16

dart

1 2//title_app.dart 3 4import 'package:flutter/material.dart'; 5import 'package:selectquiz/load_csv.dart'; 6 7 8class QuizApp extends StatelessWidget { 9 QuizApp({Key? key}) : super(key: key); 10 //この変数でのエラー 11 late List titleList; 12 13 //ここで、上記のload_csvのメソッドを使っている 14 void getTitle() async{ 15 titleList=await(getTitleCsvData('assets/titledata.csv')); 16 } 17 18//ここで最初に実行したい 19 20 void initState() { 21 getTitle(); 22 } 23 24 25 26 Widget build (BuildContext context) { 27 28 return Scaffold( 29 body: ListView.builder( 30 itemCount: titleList.length, 31 itemBuilder: (context,index){ 32 return ListTile( 33 title: Text(titleList[index]), 34 onTap: (){ 35 //goToQuizApp(context); //クイズアプリへ遷移するQuizApp関数がよばれる} 36 }, 37 ); 38 }, 39 ) 40 ); 41 } 42} 43 44

csv

1 2//assets/titledata.csv 3 4title1,title2,title3,title4,title5,title6,title7 5

試したこと

Widgetの生成を遅らせるとよいと思いますが、調べて実行しても同様なエラーがでてしまいます。

コードはすべて同階層
csvはassetsに入れており、pabspec.yamlにも記入済みです
ご教授のほうをよろしくお願いにいれいたします

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

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

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

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

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

guest

回答2

0

新しくgetFutureListFuncを作り、futurebuilderで呼ぶとうまくいきました。

Dart

1//簡略 2 3 4 Widget build (BuildContext context) { 5 return Scaffold( 6 body: FutureBuilder<List>( 7 future:getFutureListFunc(), 8 builder:(context,snapshot) { 9 if (snapshot.hasData) { 10 return ListView.builder( 11 itemCount: snapshot.data!.length, 12 itemBuilder: (context, index) { 13 return ListTile( 14 title: Text(snapshot.data![index]), 15 onTap: () { 16 //goToQuizApp(context); //クイズアプリへ遷移するQuizApp関数がよばれる} 17 }, 18 ); 19 }, 20 ); 21 }else{ 22 return Text("えらーでおます"); 23 } 24 }, 25 ) 26 ); 27 } 28 29 30 Future<List> getFutureListFunc() async { 31 return Future.delayed(new Duration(seconds: 1), () { 32 titleList=getTitleCsvData('assets/titledata.csv'); 33 return titleList; 34 }); 35 } 36} 37

投稿2023/02/23 12:14

Nanmotsu

総合スコア22

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

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

0

ベストアンサー

Futureの結果を使いウィジェットをビルドする場合は、FutureBuilderを使用するのが王道です。

https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

提示されたコードだと、titleListlate指定にしていて、initStategetTitleを呼び出しているのでbuild呼び出し前には確定しるのでは?とお思いですが、getTitleasyncなのでこの処理は非同期処理としてスケジューラーに登録され、現在の同期処理が完了するまで、実行が待機されます。

そのため、build時にはtitleListが確定されず、該当するエラーが出たということになります。

titleListFuture<List>としinitStategetTitleCsvDataで代入。
ListView.builderFutureBuilderでラップしてtitleListを取り扱うといった感じかな。

投稿2023/02/23 06:42

ta.fu

総合スコア1676

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

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

Nanmotsu

2023/02/23 12:09

futurebuilderを活用するとうまくいきました。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問