커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
4-8 likedBookList 좋아요 누른 탭이 표시되지 않습니다.
[왕초보] 플러터(Flutter)로 시작하는 앱개발 종합반
0주차
북마크
김*연
댓글
3
추천
1
조회수
12
조회수
12
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.


안녕하세요, 현재 4-8강 좋아요 구현하기 두번째 수업을 듣고 있는데 강의 마지막 코드스니펫을 복사하여 174-176 번째 줄을 지우고 붙여넣기 하였으나

likedBookList 좋아요 누른 탭이 표시되지 않습니다.


교재와는 다르게 bookService 와 likedBookList,length 그리고 BookTile이 색깔있는 코드로 표시되지 않고

PROBLEMS에 Undefined name 과 method가 명시되지 않은 것으로 뜨고 있는데 (The method 'BookTile' isn't defined for the type 'LikedBookPage'.

Try correcting the name to the name of an existing method, or defining a method named 'BookTile'.)


제 코드의 어느부분이 강사님과 다르고 문제인지 확인이 어렵습니다. 무엇이 문제일까요? 함께 살펴봐주시면 감사하겠습니다 :)





작성한 코드 및 에러 메세지

import 'package:flutter/material.dart';

import 'package:provider/provider.dart';


import 'book.dart';

import 'book_service.dart';


void main() {

 runApp(

  MultiProvider(

   providers: [

    ChangeNotifierProvider(create: (context) => BookService()),

   ],

   child: const MyApp(),

  ),

 );

}


class MyApp extends StatelessWidget {

 const MyApp({Key? key}) : super(key: key);


 @override

 Widget build(BuildContext context) {

  return MaterialApp(

   debugShowCheckedModeBanner: false,

   home: HomePage(),

  );

 }

}


class HomePage extends StatefulWidget {

 HomePage({Key? key}) : super(key: key);


 @override

 State<HomePage> createState() => _HomePageState();

}


class _HomePageState extends State<HomePage> {

 var bottomNavIndex = 0;

 @override

 Widget build(BuildContext context) {

  return Scaffold(

   body: [

    SearchPage(),

    LikedBookPage(),

   ].elementAt(bottomNavIndex),

   bottomNavigationBar: BottomNavigationBar(

    selectedItemColor: Colors.black,

    unselectedItemColor: Colors.grey,

    showUnselectedLabels: true,

    selectedFontSize: 12,

    unselectedFontSize: 12,

    iconSize: 28,

    type: BottomNavigationBarType.fixed,

    onTap: (value) {

     setState(() {

      bottomNavIndex = value;

     });

    },

    items: [

     BottomNavigationBarItem(

      icon: Icon(Icons.search),

      label: '검색',

     ),

     BottomNavigationBarItem(

      icon: Icon(Icons.star),

      label: '좋아요',

     ),

    ],

    currentIndex: bottomNavIndex,

   ),

  );

 }

}


class SearchPage extends StatelessWidget {

 SearchPage({super.key});


 @override

 Widget build(BuildContext context) {

  return Consumer<BookService>(

   builder: (context, bookService, child) {

    return Scaffold(

     appBar: AppBar(

      backgroundColor: Colors.white,

      toolbarHeight: 80,

      title: TextField(

       onSubmitted: (value) {

        bookService.search(value);

       },

       cursorColor: Colors.grey,

       decoration: InputDecoration(

        prefixIcon: Icon(Icons.search, color: Colors.grey),

        hintText: "작품, 감독, 배우, 컬렉션, 유저 등",

        border: OutlineInputBorder(

         borderSide: BorderSide(color: Colors.white),

         borderRadius: BorderRadius.all(Radius.circular(10)),

        ),

        focusedBorder: OutlineInputBorder(

         borderSide: BorderSide(color: Colors.grey),

         borderRadius: BorderRadius.all(Radius.circular(10)),

        ),

       ),

      ),

     ),

     body: Padding(

      padding: const EdgeInsets.symmetric(horizontal: 12),

      child: ListView.separated(

       itemCount: bookService.bookList.length,

       separatorBuilder: (context, index) {

        return Divider();

       },

       itemBuilder: (context, index) {

        if (bookService.bookList.isEmpty) return SizedBox();

        Book book = bookService.bookList.elementAt(index);

        return BookTitle(book: book);

       },

      ),

     ),

    );

   },

  );

 }

}


class BookTitle extends StatelessWidget {

 const BookTitle({

  super.key,

  required this.book,

 });


 final Book book;


 @override

 Widget build(BuildContext context) {

  BookService bookService = context.read<BookService>();


  return ListTile(

   onTap: () {},

   leading: Image.network(

    book.thumbnail,

    fit: BoxFit.fitHeight,

   ),

   title: Text(

    book.title,

    style: TextStyle(fontSize: 16),

   ),

   subtitle: Text(

    book.subtitle,

    style: TextStyle(color: Colors.grey),

   ),

   trailing: IconButton(

    onPressed: () {

     bookService.toggleLikeBook(book: book);

    },

    icon: bookService.likedBookList.map((book) => book.id).contains(book.id)

      ? Icon(

        Icons.star,

        color: Colors.amber,

       )

      : Icon(Icons.star_border),

   ),

  );

 }

}


class LikedBookPage extends StatelessWidget {

 const LikedBookPage({super.key});


 @override

 Widget build(BuildContext context) {

  return Consumer<BookService>(

   builder: (context, BookService, child) {

    return Scaffold(

     body: Padding(

      padding: const EdgeInsets.symmetric(horizontal: 12),

      child: ListView.separated(

       itemCount: bookService.likedBookList.length,

       separatorBuilder: (context, index) {

        return Divider();

       },

       itemBuilder: (context, index) {

        if (bookService.likedBookList.isEmpty) return SizedBox();

        Book book = bookService.likedBookList.elementAt(index);

        return BookTile(book: book);

       },

      ),

     ),

    );

   },

  );

 }

}

오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.

Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!



취소
 공유
취소
댓글 0
댓글 알림
나의얼굴