実現したいこと
ここに実現したいことを箇条書きで書いてください。
- APIで取得したデータを元にCardでリストを作る
前提
Flutterでウィキペディアをランダムに表示するという暇つぶしアプリを作っています。
Wikipedia APIから取得したページ名やURLなどをどのようにしてCardにすればいいのかが分からず、教えて頂きたいです。
色々試しすぎてグチャグチャになっていますが初心者なのでお許しください。
該当のソースコード
[readwiki.dart]
dart
1import 'package:flutter/material.dart'; 2import 'package:wikidom/components/appbar.dart'; 3import 'package:wikidom/services/random_get.dart'; 4 5class ReadWiki extends StatefulWidget { 6 const ReadWiki({super.key}); 7 8 9 State<ReadWiki> createState() => _ReadWikiState(); 10} 11 12class _ReadWikiState extends State<ReadWiki> { 13 14 Widget build(BuildContext context) { 15 return Scaffold( 16 appBar: const CustomAppBar(title: "Wikidom"), 17 floatingActionButton: FloatingActionButton( 18 onPressed: () { 19 RandomArticle(); 20 }, 21 child: const Icon(Icons.loop), 22 ), 23 body: SingleChildScrollView( 24 child: Column( 25 children: [ 26 Card( 27 child: SizedBox( 28 height: 100, 29 child: Center( 30 child: ListTile( 31 leading: Image.network('https://placehold.jp/50x50.png'), 32 title: const Text('Wikipedia'), 33 trailing: const Icon(Icons.more_vert), 34 ), 35 ), 36 ), 37 ), 38 ], 39 ), 40 ), 41 ); 42 } 43}
[random_get.dart]
dart
1import 'dart:convert'; 2 3import 'package:flutter/material.dart'; 4import 'package:http/http.dart' as http; 5 6class RandomArticle extends StatefulWidget { 7 RandomArticle({super.key}); 8 9 10 State<RandomArticle> createState() => _RandomArticleState(); 11} 12 13class _RandomArticleState extends State<RandomArticle> { 14 String pageTitle = ""; 15 String imageUrl = ""; 16 String pageUrl = ""; 17 18 Future<void> getRandomArticle() async { 19 final response = await http.get(Uri.parse( 20 'https://ja.wikipedia.org/w/api.php?action=query&format=json&list=random&rnnamespace=0&rnlimit=1')); 21 22 if (response.statusCode == 200) { 23 Map<String, dynamic> data = json.decode(response.body); 24 25 if (data.containsKey('query') && data['query']['random'].length > 0) { 26 var pageId = data['query']['random'][0]['id']; 27 await getArticleDetails(pageId); 28 } 29 } else { 30 // Handle error 31 print('Failed to load random article'); 32 } 33 } 34 35 Future<void> getArticleDetails(int pageId) async { 36 final response = await http.get(Uri.parse( 37 'https://ja.wikipedia.org/w/api.php?action=query&format=json&pageids=$pageId&prop=info|pageimages&pithumbsize=500')); 38 39 if (response.statusCode == 200) { 40 Map<String, dynamic> data = json.decode(response.body); 41 42 if (data.containsKey('query') && data['query']['pages'].length > 0) { 43 var page = data['query']['pages'][pageId.toString()]; 44 setState(() { 45 pageTitle = page['title']; 46 imageUrl = 47 page.containsKey('thumbnail') ? page['thumbnail']['source'] : ''; 48 pageUrl = 'https://ja.wikipedia.org/wiki/$pageTitle'; 49 }); 50 } 51 } else { 52 // Handle error 53 print('Failed to load article details'); 54 } 55 } 56 57 58 Widget build(BuildContext context) { 59 return Card( 60 child: SizedBox( 61 height: 100, 62 child: Center( 63 child: ListTile( 64 leading: Image.network(imageUrl), 65 title: Text(pageTitle), 66 trailing: const Icon(Icons.more_vert), 67 onTap: () {}, 68 ), 69 ), 70 ), 71 ); 72 } 73}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。