
라우터가 아닌 상태로 페이지를 이동 할 때가 있습니다.
컨텍스트는 내 화면 정보를 갖고 있습니다.

이 화면에 해당하는 정보를 갖고 있겠죠, 따라서 이전 페이지가 존재해야 상세 페이지로 갈 수있기 때문에 항상 컨텍스트를 갖고 가야합니다.
1. 페이지 이동때 매개변수 전달하기

MaterialPageRoute 로 이동을 하게 되면 라우터와는 다른 장점을 갖습니다.
이는 매개 변수를 들고 갈 수 있다는 점입니다.

이 페이지로 저 id 값을 들고 갈 것입니다.

id 를 매개변수로 넘겨주기 때문에 
PostDatailPage 에서도 id 를 받아주고, 그림을 그릴 주체인
PostDetailBody 에도 id 값을 전달합니다. (디테일 바디에도 id 를 받을 수 있도록 추가합니다)
2.

PostDetailModel? model = ref.watch(postDetailProvider);
제일 처음은 데이터 전달이 끝나기 전이기 때문에 null 값을 화면에 전송하게 됩니다. (빙글빙글 효과로 인해 보이지 않게 설정할 수 있습니다.)
이때 프로바이더가 
watch 를  하고 있으므로, 값이 변경되면 상태변경된 부분만 다시 그리게 됩니다.
프로바이더에 패밀리를 추가하여 int 를 매개변수를 받을 수 있도록 추가하였습니다.
만약 매개변수를 더 넣고싶다면 매개변수들을 클래스로 만들어 넣어야합니다.


여하튼, 다시 코드로 돌아갑니다.
// 3. 창고 관리자 (Provider)
final postDetailProvider =
    StateNotifierProvider.family<PostDetailVm, PostDetailModel?, int>(
        (ref, id) {
  return PostDetailVm(null)..notifyInit(id);
});이제 통신 로직을 짜야 합니다.
지금 하지는 않지만 내용이 하나만 생성되도록 하는 법
매변 새로 생성되게 하지 않게 하려면 const 로 생성하거나, singleton 패턴을 활용할 수 있습니다.



일단 리턴을 기다리는 값들을 봅니다.
class PostDetailModel {
  int id;
  String title;
  String content;
  DateTime createdAt;
  DateTime updatedAt;
  PostDetailModel.fromMap(map)
      : this.id = map["id"],
        this.title = map["title"],
        this.content = map["content"],
        this.createdAt = map["createdAt"],
        this.updatedAt = map["updatedAt"];
}데이터를 매핑할 녀석들을 만듭니다.
왜 맵에서 꺼내느냐 하면 이 body 에 들어있는 값들을
Map<String, dynamic> 키, 값을 갖고있는 배열 로 보고 있기 때문입니다.


이 물음표를 넣지 않는다면 빈 생성자나, 빈 문자열 이라도 넣어야 한다.
그렇게 되면 if 문에서 null 체크를 할 수 없고, 코드가 불편해 진다. 따라서 
? 를 넣어 null 허용 하는 편이 훨 편하다.if 문으로 null 체크 하고 나면 끝.
import 'package:blog/ui/detail/post_detail_vm.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class PostDetailBody extends ConsumerWidget {
  int id;
  PostDetailBody(this.id);
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    PostDetailModel? model = ref.watch(postDetailProvider(id));
    if (model == null) {
      return Center(child: CircularProgressIndicator());
    } else {
      return Padding(
        padding: const EdgeInsets.symmetric(horizontal: 16),
        child: Column(
          children: [
            Align(
              alignment: Alignment.centerRight,
              child: ElevatedButton(
                child: Icon(CupertinoIcons.trash_fill),
                onPressed: () {},
              ),
            ),
            SizedBox(height: 10),
            Text("id : ${model.id}", style: TextStyle(fontSize: 20)),
            Text("title : ${model.title}"),
            Text("content : ${model.content}"),
            Text("createdAt : ${model.createdAt}"),
            Text("updatedAt : ${model.updatedAt}"),
          ],
        ),
      );
    }
  }
}

로딩 라이브러리
- 서버 통신 - jar 파일 만들기 / 설정 https://inblog.ai/hj/서버-통신하기1-설정-31514
- 서버 통신 - 상세 페이지 보기 https://inblog.ai/hj/서버-통신하기2-상세-페이지-보기-31515
- 서버 통신 - 글쓰기 https://inblog.ai/hj/서버-통신하기3-글쓰기-31518
- 서버 통신 - 게시글 삭제 https://inblog.ai/hj/서버-통신하기4-게시글-삭제-31519
Share article