main.dart
import 'package:ds_state/model/counter_model.dart';
import 'package:ds_state/screen/decrease_screen.dart';
import 'package:ds_state/screen/detail_screen.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => CounterModel())
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: DetailScreen(),
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Consumer<CounterModel>(builder: (context, counterModel, child){
return Text('${counterModel.counter}', style: TextStyle(fontSize: 30),);
}),
ElevatedButton(onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DecreaseScreen(),
),
);
},
child: Text('숫자 차감하러 가기'),
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: (){
Provider.of<CounterModel>(context, listen: false).plus();
},
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
detail_screen.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
class DetailScreen extends StatefulWidget {
const DetailScreen({super.key});
@override
State<DetailScreen> createState() => _DetailScreenState();
}
class _DetailScreenState extends State<DetailScreen> {
TextStyle ts = TextStyle(fontSize: 20);
int userId = 0;
int id = 0;
String title = '';
bool completed = false;
void fetchTodo() async{
// TODO REST API(주소) 요청
var response = await http.get(Uri.parse('<https://jsonplaceholder.typicode.com/todos/2>'));
print(response.body);
var json = jsonDecode(response.body);
setState(() {
userId = json['userId'];
id = json['id'];
title = json['title'];
completed = json['completed'];
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
fetchTodo();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('TODO 상세'),
),
body: Container(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
Text('userId : $userId', style: ts,),
Text('id : $id', style: ts,),
Text('title : $title', style: ts,),
Text('completed : $completed', style: ts,),
ElevatedButton(
onPressed: (){
// fetchTodo();
},
child: Text('요청하기')
)
],
),
),
);
}
}