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

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

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

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

Dart

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

Q&A

解決済

1回答

666閲覧

flutterのDataTableで重複したレコードが出力される

tama826

総合スコア3

Flutter

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

Dart

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

0グッド

0クリップ

投稿2023/02/10 02:11

編集2023/02/10 02:13

実現したいこと・前提

flutterでAPIから取得した結果をDataTableで出力するプログラムを作成しています。
DataTableの出力結果を確認したところ、APIで取得した結果を繰り返し出力していることがわかりました。

APIで取得した結果を1回分のみ出力させるように修正したいのですが、原因がわかりませんでした。
ご教授よろしくお願い致します。

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

実行時のエラーはありません。

該当のソースコード

dart

1class ListPage extends StatelessWidget { 2 const ListPage( 3 {required this.color, 4 required this.title, 5 this.listIndex = 0, 6 this.onPush, 7 Key? key}) 8 : super(key: key); 9 final MaterialColor color; 10 final String title; 11 final int listIndex; 12 final ValueChanged<int>? onPush; 13 14 15 16 Widget build(BuildContext context) { 17 18 return Scaffold( 19 appBar: AppBar( 20 backgroundColor: color, 21 title: Text( 22 title, 23 ), 24 ), 25 body: SafeArea( 26 child: Container( 27 margin: const EdgeInsets.all(20), 28 child: const List(), 29 ), 30 ), 31 ); 32 } 33} 34 35class List extends StatefulWidget { 36 const List({Key? key}) : super(key: key); 37 38 39 State<List> createState() => _ListState(); 40} 41 42class _ListState extends State<List> { 43 44 Widget build(BuildContext context) { 45 return FutureBuilder( 46 future: Provider.of<ListApi>(context, listen: false).fetchList(), 47 builder: (ctx, dataSnapshot) { 48 if (dataSnapshot.connectionState == ConnectionState.waiting) { 49 // 非同期処理未完了 = 通信中 50 return const Center(child: CircularProgressIndicator()); 51 } 52 if (dataSnapshot.error != null) { 53 // エラー 54 return const Center(child: Text('データ取得に失敗しました.')); 55 } 56 // 成功処理 57 return Consumer<ListApi>( 58 builder: (BuildContext content, ListApi List, child) => 59 ListView.builder( 60 itemCount: List.items.length, 61 itemBuilder: (BuildContext context, int index) { 62 return SingleChildScrollView( 63 scrollDirection: Axis.horizontal, 64 child: DataTable(columnSpacing: 38.0, columns: const [ 65 DataColumn(label: TextWidget(value: 'カラム1', size: 18),), 66 DataColumn(label: TextWidget(value: 'カラム2', size: 18),), 67 DataColumn(label: TextWidget(value: 'カラム3', size: 18),), 68 ], rows: List.items.map((e) => DataRow( 69 selected: false, 70 onSelectChanged: (value) {}, 71 cells: [ 72 DataCell(TextWidget(value: e.column1, size: 18)), 73 DataCell(TextWidget(value: e.column2.toString(), size: 18)), 74 DataCell(TextWidget(value: e.column3.toString(), size: 18)), 75 ] 76 )).toList(), 77 ), 78 ); 79 }, 80 ), 81 ); 82 }, 83 ); 84 } 85} 86

dart

1 2 3class ListApi with ChangeNotifier { 4 List<ListModel> _items = []; 5 6 List<ListModel> get items { 7 return [..._items]; 8 } 9 10 Future<void> fetchList() async { 11 _items = []; 12 13 dynamic json = await NetworkHelper.getData('$apiRoute/api'); 14 print(json); 15 16 for (int i = 0; i < json.length; i++) { 17 _items.add(ListModel( 18 column1: json[i]['column1'], 19 column2: json[i]['column2'], 20 column3: json[i]['column3'], 21 )); 22 } 23 notifyListeners(); 24 } 25} 26

試したこと

以下のサイトを参考にして実行は確認できたが重複したレコードが出力されるエラーが解消されなかった。
https://stackoverflow.com/questions/66981236/flutter-datatable-from-api

ListApiの取得結果は想定した結果が返ってきていることを確認しました。
また、Listのビルドは想定通り1回のみビルドされていることを確認しました。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

ListView-SingleChildScrollView-DataTable というウィジェット構造になってるけど、先頭になっているListViewが要らないのでは。

ListViewでList.items分子要素を作り、さらにその子要素の中にDataTableのセルがList.items分入っているので、List.items分DataTableが表示されているようになっている。

投稿2023/02/10 09:43

ta.fu

総合スコア1667

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

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

tama826

2023/02/13 05:36

コメントありがとうございます。 ListViewの削除で解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問