도서관리앱을 만들 때 정리

테디준·2022년 8월 4일
0

1. bookListScreen의 이 부분

ListView(
   children: snapshot.data!.docs.map((DocumentSnapshot document) {
   Map<String, dynamic> data =
   document.data()! as Map<String, dynamic>;

2. Navigator push로 넘어가는데 addBookScreen()은 이렇게 비워놔도 되는데, updateBookScreen()은 비워놓으면 에러가 나는지? 이 안에 document.id를 적으면 왜 document에 빨간불이 들어오는지?

child: ListTile(
  onTap: () {
   Navigator.push(
   context,
   MaterialPageRoute(
   builder: (context) => UpdateBookScreen(document.id)),
   );
  },
   title: Text(data['title']),
   subtitle: Text(data['author']),
     ),
    );
   }).toList(),

위의 UpdateBookScreen(document.id) 중에 빨간불이 들어오는 document에 alt+enter를 하면 "add required positional parameter"라고 나오고 그걸 누르면 아래와 같이 변수를 뚫어준다. 그런데 내 경우엔 document에 그런 게 나오지 않았다. 무엇이 문제지?

class UpdateBookScreen extends StatefulWidget {
  final DocumentSnapshot document;

  const UpdateBookScreen(this.document, {Key? key}) : super(key: key);

3. 에러 처리

1) 추가부분에 입력값이 없으면 수정버튼이 활성활되지 않게 해야 한다. 글자를 적을 때 수정버튼이 활성화되게 하기 위해 setState()를 Textfield에 넣어준다.
TextField(
  onChanged: (_) {
  setState(() {});
  },
  controller: _authorTextController,
  decoration: const InputDecoration(
  border: OutlineInputBorder(),
  labelText: '저자',
    ),
   ),
2) try-catch로 에러를 검사하고 처리한다.
 try {
  // 에러가 날 것 같은 코드
  } catch (e) {
 // 에러가 났을 때
 } finally {
// (옵션)
// 에러가 나거나, 안 나거나 무조건 마지막에 수행되는 블럭
 }
viewModel파일에는 아래와 같이 조건을 달아 에러 발생시 나오는 에러문구를 설정한다.
bool isValid = title.isNotEmpty && author.isNotEmpty;

    if (isValid) {
      _db.collection('books').doc(id).set({
        "title": title,
        "author": author,
      });
    } else if (title.isEmpty && author.isEmpty) {
      throw '모두 입력해 주세요';
    } else if (title.isEmpty) {
      throw '제목을 입력해 주세요';
    } else if (author.isEmpty) {
      throw '저자를 입력해 주세요';
    }

final snackBar = SnackBar(content: Text(e.toString()),
e.toString() 부분이 에러가 났을 때 throw 뒷부분을 그대로 가져온다.

3) 도서 수정 시 제목과 저자가 지워지고 에러메시지는 스낵바를 이용해 제대로 뜨나, 다시 써지지 않는 문제가 생겼다.

0개의 댓글