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
相关产品推荐
相关产品推荐

