커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
숙제 - 짝맞추기 게임 점수 추가하기 질문
[왕초보] 플러터(Flutter)로 시작하는 앱개발 종합반
1주차
북마크
이*슬
댓글
4
추천
0
조회수
11
조회수
11
답변 완료


화면 스코어가 안변해요 어디를 변경 해야되는지 잘 모르겠습니다.

짝이 맞을 경우 스코어가 올라가는걸 print로 확인해서 올라가는걸 확인했는데 header에 전달이 안되는거 같습니다.

이미지 밑에 코드 첨부 했습니다

스파르타 즉문즉답스파르타 즉문즉답


----------------------------------------------------------------------

home code


import 'package:flutter/material.dart';

import 'package:memory_matching_game/src/card_boards.dart';

import 'package:memory_matching_game/src/header.dart';


class Home extends StatefulWidget {

  @override

  State<Home> createState() => _HomeState();

}


class _HomeState extends State<Home> {

  int tryCount = 0;

  int score = 0;


  void updateTryCount(){

    setState(() {

      tryCount++;

      print('tryCount +1');

    });

  }


  void updateScore(){

    setState(() {

      score +=100;

      print(score);

    });

  }


  @override

  Widget build(BuildContext context) {

    return Scaffold(

      backgroundColor: const Color(0xffECE7E4),

      appBar: AppBar(

        title: const Text('짝맞추기 게임'),

        backgroundColor: const Color(0xff92CBFF),

      ),

      body: Padding(

        padding: EdgeInsets.all(20.0),

        child: Column(

          crossAxisAlignment: CrossAxisAlignment.stretch,

          children: [

            Header(tryCount: tryCount), // 클레스 Header에 tryCount의 값을 넘겨주는,,

            SizedBox(height: 20),

            Expanded(child: CardBoards(

              updateTryCount: updateTryCount, // CardBoards에 넘겨줌

              updateScore: updateScore,

            )),

          ],

        ),

      ),

    );

  }

}


-------------------------------

header code


import 'package:flutter/material.dart';


class Header extends StatelessWidget {

  final int tryCount;

  final int score;

  Header({super.key, this.tryCount = 0, this.score = 0});


 

 


  @override

  Widget build(BuildContext context) {

    return SizedBox(

      height: 60,

      child: Row(

        children: [

          Expanded(

              child: Column(

            crossAxisAlignment: CrossAxisAlignment.start,

            children: [

              Text(

                'score',

                style: TextStyle(

                  fontSize: 20,

                  fontWeight: FontWeight.w200,

                  color: const Color.fromARGB(255, 0, 0, 0),

                  letterSpacing: 0,

                  height: 0,

                ),

              ),

              Text(score.toString(),

                  style: TextStyle(

                      height: 0,

                      fontSize: 30,

                      letterSpacing: -2,

                      fontWeight: FontWeight.bold,

                      color: Colors.black)),

            ],

          )),

          Expanded(

              child: Column(

            crossAxisAlignment: CrossAxisAlignment.start,

            children: [

              Text(

                'try count',

                style: TextStyle(

                  fontSize: 20,

                  fontWeight: FontWeight.w200,

                  color: Colors.black,

                  letterSpacing: 0,

                  height: 0,

                ),

              ),

              Text(tryCount.toString(),

                  style: TextStyle(

                      height: 0,

                      fontSize: 30,

                      letterSpacing: -2,

                      fontWeight: FontWeight.bold,

                      color: Colors.black)),

            ],

          )),

          Expanded(

            child: Container(

              margin: EdgeInsets.only(top: 10, bottom: 10, left: 20),

              decoration: BoxDecoration(

                borderRadius: BorderRadius.circular(6),

                color: Color(0xff94BEE5),

              ),

              child: Center(child: Text('새 게임')),

            ),

          ),

        ],

      ),

    );

  }

}

-----------------------------------------

card_boards code


import 'package:flutter/material.dart';

import 'package:memory_matching_game/src/card.dart';

import 'package:memory_matching_game/src/card_model.dart';

// StatefulWidget으로 컴포트하면서 한 페이지에 두개의 클래스가 있음음

//


class CardBoards extends StatefulWidget {

  final Function() updateTryCount; //updateTryCount - 물려받음음

  final Function() updateScore;


  const CardBoards({

    super.key,

    required this.updateTryCount,

    required this.updateScore

    });


  @override

  State<CardBoards> createState() => _CardBoardsState();

}


// StatefulWidget을 상속하고 있는 CardBoards를 상속받고 있다

class _CardBoardsState extends State<CardBoards> {

  //late은 변수를 사용 하는 시점의 반드시 값이 이여야 되고

  //?는 변수를 사용 하는 시점에 null 이여도 된다 -> 조건문으로 null 체크 필수

  late List<CardModel> cards;



  @override

  void initState() {

    super.initState();

    List<int> cardsValue = [1, 5, 2, 6, 3, 4, 3, 2, 6, 1, 4, 5];

    cardsValue.shuffle(); //shuffle == random

    cards = List.generate(cardsValue.length, (index) {

      return CardModel(index: index, cardValue: cardsValue[index]);

    });

  }

  // int instantFirstCard = -1; // -1 선택하지 않았을때

  CardModel? instantFirstCard;


  void onTapCard(int cardIndex){//이벤트 발생하는 함수일 경우 함수 명에 on을 많이 사용

    print('$cardIndex 번째 카드를 선택하셨습니다.');

    if (instantFirstCard == null) {

      instantFirstCard = cards[cardIndex];

    }else{

      //두번째 카드 클릭시 로직

      //cardBoards를 상속받아서 사용하기 때문에 widget을 사용

      widget.updateTryCount();

      var firstCard = instantFirstCard;//첫번쨰 클릭한 카드

      var secondCard = cards[cardIndex];//두번 째 클릭한 카드

      print(secondCard);


      if (firstCard!.cardValue == secondCard.cardValue){ //카드 index가 동일 할 경우

            print('짝이 맞습니다');

            widget.updateScore();

            instantFirstCard = null; //카드 초기화(다음 카드 선택시 전 카드값을 없애기 위해)


      }else{//카드 index가 동일하지 않을 경우 카드 닫기

       // 변수의 ! 를 사용 하면 강제 추출

        resetInstantCards(instantFirstCard!, secondCard);

        // setState(() {// 화면 갱신을 위해서 setState 호출

        //   cardsFlippendState[instantFirstCard] = false;

        //   cardsFlippendState[cardIndex] = false;

        // });

        // instantFirstCard = -1; // 카드 초기화(다음 카드 선택시 전 카드값을 없애기 위해)

        // return;

      }

    }

    setState(() { //setState : 빌드(build)함수를 다시 호출 시킴

      // 카드를 넘겨주는 함수  

      cards[cardIndex].setFlipped(true);

    });

  }

  void resetInstantCards(CardModel firstCard, CardModel secondCard) async {

    await Future.delayed(Duration(seconds: 2));

    setState(() {

      firstCard.setFlipped(false);

      secondCard.setFlipped(false);

    });

    instantFirstCard = null;

    return;

  }




  @override

  Widget build(BuildContext context) {

    return SingleChildScrollView(

      child: Wrap(

        spacing: 4,

        runSpacing: 4,

        children: [

          // 카드 개수 변수 만큼

          for(var i = 0; i < cards.length; i++)

            CardWidget(

              card: cards[i],

              onTap: () {

                onTapCard(i);

              },

            ),

        ],

      ),

    );

  }

}


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