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('요청하기')
            )
          ],
        ),
      ),
    );
  }
}