import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
// User 모델 정의
class User {
final String name;
final String email;
User({required this.name, required this.email});
factory User.fromJson(String jsonString) {
final jsonData = json.decode(jsonString);
return User(
name: jsonData['name'],
email: jsonData['email'],
);
}
}
// userId를 관리하는 StateProvider
final userIdProvider = StateProvider<int>((ref) => 1);
// fetchUserData를 정의하는 FutureProvider.family
final fetchUserData = FutureProvider.family<User, int>((ref, userId) {
final url = 'https://jsonplaceholder.typicode.com/users/$userId';
return http.get(Uri.parse(url)).then((response) {
if (response.statusCode == 200) {
return User.fromJson(response.body);
} else {
throw Exception('Failed to load user');
}
});
});
// 메인 위젯
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// StateProvider로부터 현재 userId를 가져오기
final userId = ref.watch(userIdProvider);
// userId에 따라 fetchUserData 호출
final user = ref.watch(fetchUserData(userId));
return Scaffold(
appBar: AppBar(
title: Text('User Info'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 비동기 상태 처리
user.when(
data: (data) => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Name: ${data.name}'),
Text('Email: ${data.email}'),
],
),
error: (error, stackTrace) =>
Center(child: Text('Error: $error')),
loading: () => Center(child: CircularProgressIndicator()),
),
const SizedBox(height: 20),
// ID 증가 버튼
ElevatedButton(
onPressed: () {
// userId 증가
ref.read(userIdProvider.notifier).state++;
},
child: Text('Next User'),
),
],
),
);
}
}