커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
검색기능이 안됩니다
[왕초보] 플러터(Flutter)로 시작하는 앱개발 종합반 v0
4주차
북마크
최*진
댓글
12
추천
0
조회수
21
조회수
21
답변 완료

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

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


왓챠피디아 클론코딩 중 api 가져다 쓰는 부분에서

검색기능이 안됩니다 왜 이런걸까요 수업 잘따라갔는데 ㅠ






main


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, chlid) {

    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 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: () {},

          icon: Icon(Icons.star_border),

         ),

        );

       },

      ),

     ),

    );

   },

  );

 }

}


class LikedBookPage extends StatelessWidget {

 const LikedBookPage({super.key});


 @override

 Widget build(BuildContext context) {

  return Scaffold(

   body: Center(

    child: Text("좋아요"),

   ),

  );

 }

}



book


class Book {

 String id;

 String title;

 String subtitle;

 String thumbnail; // 썸네일 이미지 링크

 String previewLink; // ListTile 을 눌렀을 때 이동하는 링크


 Book({

  required this.id,

  required this.title,

  required this.subtitle,

  required this.thumbnail,

  required this.previewLink,

 });

}


book—service


import 'package:dio/dio.dart';

import 'package:flutter/material.dart';


import 'book.dart';


class BookService extends ChangeNotifier {

 List<Book> bookList = []; // 책 목록


 void search(String q) async {

  bookList.clear(); // 검색 버튼 누를때 이전 데이터들을 지워주기

  print(11111);

  if (q.isNotEmpty) {

   Response res = await Dio().get(

    "https://www.googleapis.com/books/v1/volumes?q=$q&startIndex=0&maxResults=40",

   );

   List items = res.data["items"];

   print(items);

   for (Map<String, dynamic> item in items) {

    Book book = Book(

     id: item['id'],

     title: item['volumeInfo']['title'] ?? "",

     subtitle: item['volumeInfo']['subtitle'] ?? "",

     thumbnail: item['volumeInfo']['imageLinks']?['thumbnail'] ??

       "https://thumbs.dreamstime.com/b/no-image-available-icon-flat-vector-no-image-available-icon-flat-vector-illustration-132482953.jpg",

     previewLink: item['volumeInfo']['previewLink'] ?? "",

    );

    bookList.add(book);

   }

  }

  notifyListeners();

 }

}

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