
화면 스코어가 안변해요 어디를 변경 해야되는지 잘 모르겠습니다.
짝이 맞을 경우 스코어가 올라가는걸 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);
},
),
],
),
);
}
}
