Flutter扑克牌操作插件playing_cards的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter扑克牌操作插件playing_cards的使用

playing_cards 插件为 Flutter 提供了轻松渲染标准52张牌的能力。默认情况下提供了良好的配置选项,但也可以通过提供样式对象进行完全自定义。

开始使用

下图展示了一些默认的纸牌:

如果你不喜欢阅读,这里有一个视频概述:点击观看

要导入此包,请在你的 Dart 文件中添加以下代码:

import 'package:playing_cards/playing_cards.dart';

这是一个简单的例子,用于渲染一张梅花9:

PlayingCardView(card: PlayingCard(Suit.clubs, CardValue.nine))

这里是一个完全自定义样式的纸牌示例:

// 这个样式对象覆盖了梅花的样式。
PlayingCardViewStyle myCardStyles = PlayingCardViewStyle(suitStyles: {
  Suit.spades: SuitStyle(
    builder: (context) => FittedBox(
          fit: BoxFit.fitHeight,
          child: Text(
            "💩",
            style: TextStyle(fontSize: 500),
          ),
        ),
    style: TextStyle(color: Colors.brown),
    cardContentBuilders: {
      CardValue.jack: (context) =>
          Image.asset("assets/jack_of_spades.png"),
      CardValue.queen: (context) =>
          Image.asset("assets/queen_of_spades.png"),
      CardValue.king: (context) =>
          Image.asset("assets/king_of_spades.png"),
    })
});
List<PlayingCard> deck = standardFiftyTwoCardDeck();
Container(
  height: 150,
  child: SingleChildScrollView(
    scrollDirection: Axis.horizontal,
    child: Row(
      children: deck.map((e) => PlayingCardView(card: e, style: myCardStyles)).toList(),
    ),
  ),
),

PlayingCardViewStyle 类还接受一个 suitBesideLabel: true 选项来将花色放在数字旁边而不是下方:

此外,还有一个扁平堆叠小部件用于常见的水平展开纸牌场景:

ShapeBorder shape = RoundedRectangleBorder(
  borderRadius: BorderRadius.circular(8),
  side: BorderSide(color: Colors.black, width: 1));
FlatCardFan(children: [
  PlayingCardView(
    card: PlayingCard(Suit.hearts, CardValue.ace),
    showBack: true,
    elevation: 3.0,
    shape: shape),
  PlayingCardView(
      card: PlayingCard(Suit.hearts, CardValue.ace),
      showBack: true,
      elevation: 3.0,
      shape: shape),
  PlayingCardView(
      card: PlayingCard(Suit.hearts, CardValue.ace),
      showBack: true,
      elevation: 3.0,
      shape: shape),
  PlayingCardView(
      card: PlayingCard(Suit.hearts, CardValue.ace),
      elevation: 3.0,
      shape: shape)
])

小丑牌

小丑牌被建模为单个小丑花色中的两个小丑卡值(小丑1,小丑2)。

你可以使用 deck.dart 中的 standardFiftyFourCardDeck() 函数来创建包含两张小丑牌的纸牌组。

完整示例代码

import 'package:flutter/material.dart';
import 'package:playing_cards/playing_cards.dart';

void main() {
  runApp(MaterialApp(
      theme: ThemeData(
          useMaterial3: true,
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue.shade700)),
      home: CardHomeView()));
}

class CardHomeView extends StatefulWidget {
  const CardHomeView({Key? key}) : super(key: key);

  [@override](/user/override)
  State<CardHomeView> createState() => _CardHomeViewState();
}

class _CardHomeViewState extends State<CardHomeView> {
  Suit suit = Suit.spades;
  CardValue value = CardValue.ace;

  // 这个样式对象覆盖了纸牌花色的样式,用文本替换图像实现花色符号。
  PlayingCardViewStyle myCardStyles = PlayingCardViewStyle(
    suitStyles: {
      Suit.spades: SuitStyle(
        builder: (context) => const FittedBox(
          fit: BoxFit.fitHeight,
          child: Text(
            "♠",
            style: TextStyle(fontSize: 500),
          ),
        ),
        style: TextStyle(color: Colors.grey[800]),
      ),
      Suit.hearts: SuitStyle(
        builder: (context) => const FittedBox(
          fit: BoxFit.fitHeight,
          child: Text(
            "♥",
            style: TextStyle(fontSize: 500, color: Colors.red),
          ),
        ),
        style: const TextStyle(color: Colors.red),
      ),
      Suit.diamonds: SuitStyle(
        builder: (context) => const FittedBox(
          fit: BoxFit.fitHeight,
          child: Text(
            "♦",
            style: TextStyle(fontSize: 500, color: Colors.red),
          ),
        ),
        style: const TextStyle(color: Colors.red),
      ),
      Suit.clubs: SuitStyle(
        builder: (context) => const FittedBox(
          fit: BoxFit.fitHeight,
          child: Text(
            "♣",
            style: TextStyle(fontSize: 500),
          ),
        ),
        style: TextStyle(color: Colors.grey[800]),
      ),
      Suit.joker: SuitStyle(builder: (context) => Container()),
    },
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          PlayingCardView(card: PlayingCard(suit, value), style: myCardStyles),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              DropdownButton<Suit>(
                value: suit,
                items: Suit.values
                    .map(
                      (s) => DropdownMenuItem(
                        value: s,
                        child: Text(s.toString()),
                      ),
                    )
                    .toList(),
                onChanged: (val) {
                  setState(() {
                    suit = val!;
                  });
                },
              ),
              DropdownButton<CardValue>(
                value: value,
                items: CardValue.values
                    .map(
                      (s) => DropdownMenuItem(
                        value: s,
                        child: Text(s.toString()),
                      ),
                    )
                    .toList(),
                onChanged: (val) {
                  setState(() {
                    value = val!;
                  });
                },
              ),
            ],
          )
        ],
      ),
    );
  }
}

更多关于Flutter扑克牌操作插件playing_cards的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter扑克牌操作插件playing_cards的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用 playing_cards 插件在 Flutter 中操作扑克牌的代码示例。这个插件提供了创建和操作扑克牌的功能,非常适合开发扑克牌游戏。

首先,确保你已经在 pubspec.yaml 文件中添加了 playing_cards 依赖:

dependencies:
  flutter:
    sdk: flutter
  playing_cards: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是一个简单的示例,展示如何使用 playing_cards 插件来生成一副扑克牌,并随机选择一张牌进行显示:

import 'package:flutter/material.dart';
import 'package:playing_cards/playing_cards.dart';
import 'dart:math';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Playing Cards Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PlayingCardsDemo(),
    );
  }
}

class PlayingCardsDemo extends StatefulWidget {
  @override
  _PlayingCardsDemoState createState() => _PlayingCardsDemoState();
}

class _PlayingCardsDemoState extends State<PlayingCardsDemo> {
  List<Card> deck = [];
  Card? selectedCard;

  @override
  void initState() {
    super.initState();
    // 创建一副标准的52张扑克牌
    deck = Deck().toList();
    // 随机选择一张牌
    Random random = Random();
    selectedCard = deck[random.nextInt(deck.length)];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Playing Cards Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Selected Card:',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            CardWidget(card: selectedCard!),
          ],
        ),
      ),
    );
  }
}

class CardWidget extends StatelessWidget {
  final Card card;

  CardWidget({required this.card});

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        border: Border.all(color: Colors.black, width: 4),
        borderRadius: BorderRadius.circular(12),
      ),
      padding: EdgeInsets.all(16),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            card.suit.toString(),
            style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
          ),
          SizedBox(height: 10),
          Text(
            card.rank.toString(),
            style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
          ),
        ],
      ),
    );
  }
}

在这个示例中:

  1. 我们首先导入了 playing_cards 插件。
  2. PlayingCardsDemo 类的 initState 方法中,我们创建了一副标准的 52 张扑克牌,并从中随机选择了一张牌。
  3. CardWidget 是一个自定义的 Flutter 小部件,用于显示一张扑克牌的图案(这里为了简单起见,只显示了花色和点数)。
  4. 主界面显示了选中的扑克牌。

这个示例只是一个起点,你可以根据需求进一步扩展功能,比如实现洗牌、发牌、处理玩家手牌等功能。希望这个示例对你有所帮助!

回到顶部