INDEX / JOURNAL / LOG-005
VOL. 2026 · ENGINEERING
SERIES 5 / 7
LOG-005 · ASYNC DATA

非同期データを三つの状態で描く

PUBLISHED
2026 · 07 · 10
AUTHOR
MIGIWAYA
READ
約 3 分
TAGS
#flutter#dart

§ 01FUTURE

lib/data/item_repository.dartDART
Future<List<Item>> fetchItems() async {
final res = await http.get(Uri.parse('$base/items'));
if (res.statusCode != 200) {
throw ItemException('取得に失敗しました (${res.statusCode})');
}
return parseItems(res.body);
}

§ 02THREE-STATES

§ 03ASYNCVALUE

§ 04FUTUREPROVIDER

lib/providers/items_provider.dartDART
final itemsProvider = FutureProvider<List<Item>>((ref) async {
return fetchItems(); // Future を返す非同期関数
});

§ 05WHEN

lib/screens/items_screen.dartDART
class ItemsScreen extends ConsumerWidget {
const ItemsScreen({super.key});
 
@override
Widget build(BuildContext context, WidgetRef ref) {
final itemsAsync = ref.watch(itemsProvider);
return itemsAsync.when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (e, st) => Center(child: Text('エラー: $e')),
data: (items) => ListView(
children: [for (final it in items) ItemTile(item: it)],
),
);
}
}
DART
final label = switch (itemsAsync) {
AsyncData(:final value) => '${value.length} 件',
AsyncError(:final error) => 'エラー: $error',
_ => '読み込み中…',
};

§ 06SUMMARY

脚注 · NOTES
  1. [1]
  2. [2]
  3. [3]
同シリーズ · Flutter の基礎を実コードで学ぶ
§ + RELATED すべて見る →
INQUIRY
CONTACT
LOCATION
STATUS
Active / Open
ESTABLISHED
2024 · 5 · 5
FORM