You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中Missing Identifier错误求助:Flutter翻牌应用修复

修复你的Flutter卡牌应用"missing_identifier"错误及其他问题

修复后的完整代码

import 'package:flutter/material.dart';

// 重命名自定义卡牌类,避免和Flutter自带Card组件冲突
class PlayingCard {
  final String cardName;
  final int cardValue;
  bool revealed;

  PlayingCard({required this.cardName, required this.cardValue, this.revealed = false});
}

class CardPile extends StatelessWidget {
  final PlayingCard card;
  
  const CardPile({required this.card, super.key});

  @override
  Widget build(BuildContext context) {
    // 用条件表达式替换原错误的if-else写法
    return Stack(
      children: [
        card.revealed
            ? Image.asset("assets/images/card_${card.cardName}.png")
            : Image.asset("assets/images/card_back.png"),
      ],
    );
  }
}

class GameScreen extends StatefulWidget {
  @override
  _GameScreenState createState() => _GameScreenState();
}

class _GameScreenState extends State<GameScreen> {
  final List<PlayingCard> deck = [
    PlayingCard(cardName: "Joker", cardValue: 0),
    PlayingCard(cardName: "Joker", cardValue: 0),
    PlayingCard(cardName: "King of Hearts", cardValue: 13),
    PlayingCard(cardName: "King of Hearts", cardValue: 13),
    // 可在此添加更多卡牌
  ];
  final List<PlayingCard> discardPile = [];

  @override
  void initState() {
    super.initState();
    _shuffleDeck();
  }

  void _shuffleDeck() {
    setState(() {
      deck.shuffle();
    });
  }

  void _onRestart() {
    setState(() {
      discardPile.clear();
      deck.addAll([
        PlayingCard(cardName: "Joker", cardValue: 0),
        PlayingCard(cardName: "Joker", cardValue: 0),
        PlayingCard(cardName: "King of Hearts", cardValue: 13),
        PlayingCard(cardName: "King of Hearts", cardValue: 13),
        // 同步添加初始化的卡牌
      ]);
      _shuffleDeck();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: Colors.black,
        child: Column(
          children: [
            const Spacer(),
            Expanded(
              child: Stack(
                children: [
                  Positioned(
                    left: 0,
                    top: 0,
                    bottom: 0,
                    child: Container(
                      width: MediaQuery.of(context).size.width / 2,
                      child: ListView(
                        children: deck.map((card) => GestureDetector(
                          onTap: () {
                            setState(() {
                              deck.remove(card);
                              card.revealed = true;
                              discardPile.add(card);
                            });
                          },
                          child: CardPile(card: card),
                        )).toList(),
                      ),
                    ),
                  ),
                  Positioned(
                    right: 0,
                    top: 0,
                    bottom: 0,
                    child: Container(
                      width: MediaQuery.of(context).size.width / 2,
                      child: ListView(
                        children: discardPile
                            .map((card) => CardPile(card: card))
                            .toList(),
                      ),
                    ),
                  ),
                  if (deck.isEmpty)
                    Center(
                      child: ElevatedButton(
                        onPressed: _onRestart,
                        child: const Text("Restart"),
                      ),
                    )
                ],
              ),
            ),
            const Spacer(),
            SizedBox(
              width: double.infinity,
              height: 50,
              child: ElevatedButton(
                style: ElevatedButton.styleFrom(backgroundColor: Colors.blue),
                onPressed: _shuffleDeck,
                child: const Text(
                  "Play",
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  runApp(const MaterialApp(
    home: GameScreen(),
  ));
}

关键修复点

  • 删除非法代码:原全局deck列表中错误插入了CardPile组件代码,这是触发"missing_identifier"错误的核心原因,直接删除这段无效代码,确保列表仅包含卡牌对象。
  • 解决命名冲突:自定义卡牌类与Flutter内置的Card组件重名,导致编译器识别混乱,将类名改为PlayingCard并同步所有引用。
  • 修正Widget列表语法:CardPile中Stack的子组件if-else写法不符合Dart语法规范,改用条件表达式实现卡牌正反面切换。
  • 替换弃用组件:将已弃用的RaisedButton替换为ElevatedButton,适配Flutter新版本API。
  • 移除重复变量:删除全局的deck和discardPile变量,只保留State类内的局部变量,避免变量作用域冲突。
  • 优化重启逻辑:修复重启按钮逻辑,确保清空弃牌堆后重新初始化牌组并洗牌,保证功能正常。

内容的提问来源于stack exchange,提问作者Michael Wallimann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:45:34