커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
스스로 해결
2주차 Shazam 클론 코딩 해설 문의 드립니다.
앱개발 종합반 - 플러터
2주차
북마크
권*이
댓글
7
추천
0
조회수
18
조회수
18
스스로 해결



아이콘과 텍스트 간격이 넓어서 GestureDetector와 child로 바꿔 진행하는 방법으로 설명하시다가 다른 방법으로 강의가 이어져서 문의드립니다.


첫번째 방법으로 진행하고 싶은데, onpressed의 에러는 어떻게 잡아야할까요?




보고 계신 화면 전체

를 캡처해 주시면, 튜터님들이 빠르게 상황을 이해할 수 있어요.




작성한 코드 및 에러 메세지

import 'package:flutter/material.dart';


void main() {

 runApp(const MyApp());

}


class MyApp extends StatelessWidget {

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


 // This widget is the root of your application.

 @override

 Widget build(BuildContext context) {

  return MaterialApp(

   title: 'Shazam',

   theme: ThemeData(

    primarySwatch: Colors.blue,

   ),

   home: HomePage(),

  );

 }

}


class HomePage extends StatefulWidget {

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


 @override

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

}


class _HomePageState extends State<HomePage> {

 @override

 Widget build(BuildContext context) {

  return DefaultTabController(

   initialIndex: 1,

   length: 3,

   child: Builder(builder: (context) {

    DefaultTabController.of(context)?.addListener(() {

     setState(() {});

    });


    return Scaffold(

     body: Stack(

      children: [

       TabBarView(

        children: [

         FirstTab(),

         SecondTab(),

         ThirdTab(),

        ],

       ),

       SafeArea(

        child: Padding(

         padding:

           const EdgeInsets.symmetric(vertical: 20, horizontal: 16),

         child: Column(

          children: [

           Container(

            alignment: Alignment.topCenter,

            child: TabPageSelector(

             color: DefaultTabController.of(context)?.index == 1

               ? Colors.blue[300]

               : Colors.grey[400],

             selectedColor:

               DefaultTabController.of(context)?.index == 1

                 ? Colors.white

                 : Colors.blue,

             indicatorSize: 8,

            ),

           ),

          ],

         ),

        ),

       ),

      ],

     ),

    );

   }),

  );

 }

}


// 첫번째 페이지

class FirstTab extends StatelessWidget {

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


 @override

 Widget build(BuildContext context) {

  const songs = [

   {

    'imageUrl': 'https://i.ytimg.com/vi/jAO0KXRdz_4/hqdefault.jpg',

    'title': '가을밤에 든 생각',

    'artist': '잔나비',

   },

   {

    'imageUrl': 'https://i.ytimg.com/vi/jAO0KXRdz_4/hqdefault.jpg',

    'title': '가을밤에 든 생각',

    'artist': '잔나비',

   },

   {

    'imageUrl': 'https://i.ytimg.com/vi/jAO0KXRdz_4/hqdefault.jpg',

    'title': '가을밤에 든 생각',

    'artist': '잔나비',

   },

   {

    'imageUrl': 'https://i.ytimg.com/vi/jAO0KXRdz_4/hqdefault.jpg',

    'title': '가을밤에 든 생각',

    'artist': '잔나비',

   },

   {

    'imageUrl': 'https://i.ytimg.com/vi/jAO0KXRdz_4/hqdefault.jpg',

    'title': '가을밤에 든 생각',

    'artist': '잔나비',

   },

   {

    'imageUrl': 'https://i.ytimg.com/vi/jAO0KXRdz_4/hqdefault.jpg',

    'title': '가을밤에 든 생각',

    'artist': '잔나비',

   },

  ];


  return Center(child: Text('첫번째 페이지'));

 }

}


// 두번째 페이지

class SecondTab extends StatelessWidget {

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


 @override

 Widget build(BuildContext context) {

  return Container(

   decoration: BoxDecoration(

    gradient: LinearGradient(

     begin: Alignment.topCenter,

     end: Alignment.bottomCenter,

     colors: [Colors.blue[300]!, Colors.blue[900]!],

    ),

   ),

   child: SafeArea(

    child: Column(

     children: [

      Row(

       mainAxisAlignment: MainAxisAlignment.spaceBetween,

       children: [

        Column(

         children: [

          GestureDetector(

           onPressed: () {},

           child: Icon(

            Icons.person,

            color: Colors.white,

           ),

          ),

          Text(

           "라이브러리",

           style: TextStyle(color: Colors.white),

          )

         ],

        ),

        //ainAxisAlignment.spaceBetween 대신 여기에 Spacer() 사용해도 괜찮음.

        Column(

         children: [

          GestureDetector(

           onPressed: () {},

           child: Icon(

            Icons.show_chart,

            color: Colors.white,

           ),

          ),

          Text(

           "차트",

           style: TextStyle(color: Colors.white),

          )

         ],

        )

       ],

      )

     ],

    ),

   ),

  );

 }

}


// 세번째 페이지

class ThirdTab extends StatelessWidget {

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


 @override

 Widget build(BuildContext context) {

  const chartData = {

   'korea': [

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

   ],

   'global': [

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

   ],

   'newyork': [

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

    {

     'imageUrl': 'https://i.ibb.co/xf2HpfG/dynamite.jpg',

     'name': 'Dynamite',

     'artist': 'BTS',

    },

   ],

  };


  return Center(child: Text('세번째 페이지'));

 }

}



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