Refactor chess square and prepare display of square in check.

This commit is contained in:
Marco 2023-09-04 21:39:51 +02:00
parent 102c0de20d
commit 01dcc74cfc
14 changed files with 329 additions and 167 deletions

View File

@ -23,6 +23,7 @@ class ApiWebsocketMessage {
final ApiColor? color;
final String? reason;
final String? position;
final ApiCoordinate? squareInCheck;
ApiWebsocketMessage({
required this.type,
@ -30,6 +31,7 @@ class ApiWebsocketMessage {
required this.color,
required this.reason,
required this.position,
required this.squareInCheck,
});
factory ApiWebsocketMessage.fromJson(Map<String, dynamic> json) {
@ -43,6 +45,7 @@ class ApiWebsocketMessage {
color: ApiColor.fromJson(json['color']),
reason: null,
position: null,
squareInCheck: null,
);
break;
case MessageType.move:
@ -52,6 +55,7 @@ class ApiWebsocketMessage {
color: null,
reason: null,
position: json['position'],
squareInCheck: json['squareInCheck']
);
break;
case MessageType.invalidMove:
@ -61,6 +65,7 @@ class ApiWebsocketMessage {
color: null,
reason: json['reason'],
position: null,
squareInCheck: json['squareInCheck'],
);
}
return ret;

View File

@ -24,7 +24,7 @@ class ChessBoard extends StatelessWidget {
bool squareWasPartOfLastMove = false;
if ((boardState.lastMove.to == ChessCoordinate(column, row) ||
boardState.lastMove.from == ChessCoordinate(column, row)) &&
boardState.positionAckd) {
boardState.positionAckdByServer) {
squareWasPartOfLastMove = true;
}

View File

@ -1,10 +1,5 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart';
import 'package:mchess/chess_bloc/promotion_bloc.dart';
import '../chess_bloc/chess_events.dart';
import 'package:mchess/chess/chess_square_outer_dragtarget.dart';
import '../utils/chess_utils.dart';
class ChessSquare extends StatelessWidget {
@ -53,94 +48,11 @@ class ChessSquare extends StatelessWidget {
@override
Widget build(BuildContext context) {
double windowWidth = MediaQuery.of(context).size.width;
double windowHeight = MediaQuery.of(context).size.height;
double draggableFdbSize;
if (windowWidth < windowHeight) {
draggableFdbSize = 0.15 * windowWidth;
} else {
draggableFdbSize = 0.15 * windowHeight;
}
return DragTarget<PieceDragged>(
onWillAccept: (move) {
if (move?.fromSquare == coordinate) {
return false;
}
return true;
},
onAccept: (pieceDragged) {
// Replace the dummy value with the actual target of the move.
pieceDragged.toSquare = coordinate;
if (isPromotionMove(pieceDragged)) {
var move = ChessMove(
from: pieceDragged.fromSquare, to: pieceDragged.toSquare);
PromotionBloc.getInstance().add(PawnMovedToPromotionField(
move: move, colorMoved: ChessBloc.myColor!));
} else if (coordinate != pieceDragged.fromSquare) {
ChessBloc.getInstance().add(OwnPieceMoved(
startSquare: pieceDragged.fromSquare,
endSquare: pieceDragged.toSquare,
piece: pieceDragged.movedPiece!));
}
},
builder: (context, candidateData, rejectedData) {
var maxDrags = kDebugMode
? 1
: ((ChessBloc.turnColor == ChessBloc.myColor) &&
(containedPiece?.color == ChessBloc.turnColor)
? 1
: 0);
return Container(
color: color,
width: ChessSquare.pieceWidth,
height: ChessSquare.pieceWidth,
child: Draggable<PieceDragged>(
/* We create the move with the startSquare == endSquare. The receiving widget will give the correct value to end square. */
data: PieceDragged(coordinate, coordinate, containedPiece),
maxSimultaneousDrags: maxDrags,
feedback: FractionalTranslation(
translation: const Offset(-0.5, -0.75),
child: SizedBox(
height: draggableFdbSize,
width: draggableFdbSize,
child: containedPiece),
),
childWhenDragging: Container(),
dragAnchorStrategy: pointerDragAnchorStrategy,
child: containedPiece ?? Container(),
onDragCompleted: () {},
onDragStarted: () {},
),
child: ChessSquareOuterDragTarget(
coordinate: coordinate,
containedPiece: containedPiece ?? const ChessPiece.none()),
);
},
);
}
bool isPromotionMove(PieceDragged move) {
bool isPromotion = false;
if (move.movedPiece!.pieceClass != ChessPieceClass.pawn) {
return isPromotion;
}
switch (ChessBloc.myColor) {
case ChessColor.black:
if (move.toSquare.row == 1) {
isPromotion = true;
}
break;
case ChessColor.white:
if (move.toSquare.row == 8) {
isPromotion = true;
}
break;
case null:
break;
}
return isPromotion;
}
}

View File

@ -0,0 +1,55 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:mchess/chess/chess_square.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart';
import 'package:mchess/utils/chess_utils.dart';
class ChessSquareInnerDraggable extends StatelessWidget {
const ChessSquareInnerDraggable({
super.key,
required this.coordinate,
required this.containedPiece,
});
final ChessCoordinate coordinate;
final ChessPiece? containedPiece;
@override
Widget build(BuildContext context) {
double windowWidth = MediaQuery.of(context).size.width;
double windowHeight = MediaQuery.of(context).size.height;
double draggableFdbSize;
var canMove = (ChessBloc.turnColor == ChessBloc.myColor) &&
(containedPiece?.color == ChessBloc.turnColor);
var maxDrags = kDebugMode ? 1 : (canMove ? 1 : 0);
if (windowWidth < windowHeight) {
draggableFdbSize = 0.15 * windowWidth;
} else {
draggableFdbSize = 0.15 * windowHeight;
}
return SizedBox(
width: ChessSquare.pieceWidth,
height: ChessSquare.pieceWidth,
child: Draggable<PieceDragged>(
/* We create the move with the startSquare == endSquare. The receiving widget will give the correct value to end square. */
data: PieceDragged(coordinate, coordinate, containedPiece),
maxSimultaneousDrags: maxDrags,
feedback: FractionalTranslation(
translation: const Offset(-0.5, -0.75),
child: SizedBox(
height: draggableFdbSize,
width: draggableFdbSize,
child: containedPiece),
),
childWhenDragging: Container(),
dragAnchorStrategy: pointerDragAnchorStrategy,
child: containedPiece ?? Container(),
onDragCompleted: () {},
onDragStarted: () {},
),
);
}
}

View File

@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:mchess/chess/chess_square_inner_draggable.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart';
import 'package:mchess/chess_bloc/chess_events.dart';
import 'package:mchess/chess_bloc/promotion_bloc.dart';
import 'package:mchess/utils/chess_utils.dart';
class ChessSquareOuterDragTarget extends StatelessWidget {
final ChessCoordinate coordinate;
final ChessPiece containedPiece;
const ChessSquareOuterDragTarget(
{super.key,
required this.coordinate,
required this.containedPiece});
@override
Widget build(BuildContext context) {
return DragTarget<PieceDragged>(
onWillAccept: (move) {
if (move?.fromSquare == coordinate) {
return false;
}
return true;
},
onAccept: (pieceDragged) {
// Replace the dummy value with the actual target of the move.
pieceDragged.toSquare = coordinate;
if (isPromotionMove(pieceDragged)) {
var move = ChessMove(
from: pieceDragged.fromSquare, to: pieceDragged.toSquare);
PromotionBloc.getInstance().add(PawnMovedToPromotionField(
move: move, colorMoved: ChessBloc.myColor!));
} else if (coordinate != pieceDragged.fromSquare) {
ChessBloc.getInstance().add(OwnPieceMoved(
startSquare: pieceDragged.fromSquare,
endSquare: pieceDragged.toSquare,
piece: pieceDragged.movedPiece!));
}
},
builder: (context, candidateData, rejectedData) {
return ChessSquareInnerDraggable(
coordinate: coordinate,
containedPiece: containedPiece,
);
},
);
}
bool isPromotionMove(PieceDragged move) {
bool isPromotion = false;
if (move.movedPiece!.pieceClass != ChessPieceClass.pawn) {
return isPromotion;
}
switch (ChessBloc.myColor) {
case ChessColor.black:
if (move.toSquare.row == 1) {
isPromotion = true;
}
break;
case ChessColor.white:
if (move.toSquare.row == 8) {
isPromotion = true;
}
break;
case null:
break;
}
return isPromotion;
}
}

View File

@ -1,19 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart';
import '../utils/chess_utils.dart';
class TurnIndicator extends StatelessWidget {
const TurnIndicator({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ChessBloc, ChessBoardState>(
builder: (context, state) => Text(
state.newTurnColor == ChessColor.white ? "white" : "black",
style: const TextStyle(color: Colors.white),
),
);
}
}

View File

@ -44,6 +44,7 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
ChessPositionManager.getInstance().currentPosition,
ChessMove.none(),
false,
ChessCoordinate.none(),
),
);
}
@ -58,6 +59,7 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
state.position,
ChessMove.none(),
false,
ChessCoordinate.none(),
),
);
}
@ -79,6 +81,7 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
event.position,
ChessMove(from: event.startSquare, to: event.endSquare),
true,
event.squareInCheck,
),
);
}
@ -93,6 +96,7 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
color: null,
reason: null,
position: null,
squareInCheck: null,
);
ServerConnection.getInstance().send(jsonEncode(apiMessage));
@ -104,7 +108,8 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
tempPosition[move.from] = const ChessPiece.none();
emit(
ChessBoardState(state.bottomColor, turnColor, tempPosition, move, false),
ChessBoardState(state.bottomColor, turnColor, tempPosition, move, false,
ChessCoordinate.none()),
);
}
@ -120,6 +125,7 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
color: null,
reason: null,
position: null,
squareInCheck: null,
);
log(jsonEncode(message));
ServerConnection.getInstance().send(jsonEncode(message));
@ -128,8 +134,14 @@ class ChessBloc extends Bloc<ChessEvent, ChessBoardState> {
void invalidMoveHandler(
InvalidMovePlayed event, Emitter<ChessBoardState> emit) {
emit(
ChessBoardState(state.bottomColor, turnColor,
ChessPositionManager.getInstance().currentPosition, ChessMove.none(), false),
ChessBoardState(
state.bottomColor,
turnColor,
ChessPositionManager.getInstance().currentPosition,
ChessMove.none(),
false,
event.squareInCheck,
),
);
}
}
@ -139,10 +151,17 @@ class ChessBoardState {
final ChessColor newTurnColor;
final ChessPosition position;
final ChessMove lastMove;
final bool positionAckd;
final bool positionAckdByServer;
final ChessCoordinate squareInCheck;
ChessBoardState._(
this.bottomColor, this.newTurnColor, this.position, this.lastMove, this.positionAckd);
this.bottomColor,
this.newTurnColor,
this.position,
this.lastMove,
this.positionAckdByServer,
this.squareInCheck,
);
factory ChessBoardState(
ChessColor bottomColor,
@ -150,8 +169,10 @@ class ChessBoardState {
ChessPosition position,
ChessMove lastMove,
bool positionAckd,
ChessCoordinate squareInCheck,
) {
return ChessBoardState._(bottomColor, turnColor, position, lastMove, positionAckd);
return ChessBoardState._(bottomColor, turnColor, position, lastMove,
positionAckd, squareInCheck);
}
factory ChessBoardState.init() {
@ -166,6 +187,7 @@ class ChessBoardState {
ChessPositionManager.getInstance().currentPosition,
ChessMove.none(),
false,
ChessCoordinate.none(),
);
}

View File

@ -7,8 +7,14 @@ class ReceivedMove extends ChessEvent {
final ChessCoordinate startSquare;
final ChessCoordinate endSquare;
final ChessPosition position;
final ChessCoordinate squareInCheck;
ReceivedMove({required this.startSquare, required this.endSquare, required this.position});
ReceivedMove({
required this.startSquare,
required this.endSquare,
required this.position,
required this.squareInCheck,
});
}
class OwnPieceMoved extends ChessEvent {
@ -41,6 +47,10 @@ class ColorDetermined extends ChessEvent {
class InvalidMovePlayed extends ChessEvent {
final ChessMove move;
final ChessCoordinate squareInCheck;
InvalidMovePlayed({required this.move});
InvalidMovePlayed({
required this.move,
required this.squareInCheck,
});
}

View File

@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:mchess/api/move.dart';
import 'package:mchess/api/websocket_message.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart';
import 'package:mchess/chess_bloc/chess_events.dart';
@ -88,11 +89,16 @@ class ServerConnection {
var move = ChessMove.fromApiMove(apiMessage.move!);
if (apiMessage.position != null) {
ChessBloc.getInstance().add(ReceivedMove(
ChessBloc.getInstance().add(
ReceivedMove(
startSquare: move.from,
endSquare: move.to,
position: ChessPositionManager.getInstance()
.fromPGNString(apiMessage.position!)));
.fromPGNString(apiMessage.position!),
squareInCheck:
ChessCoordinate.fromApiCoordinate(apiMessage.squareInCheck ?? const ApiCoordinate(col: 0, row: 0)),
),
);
} else {
log('Error: no position received');
}
@ -100,7 +106,12 @@ class ServerConnection {
void handleInvalidMoveMessage(ApiWebsocketMessage apiMessage) {
log("invalid move message received, with move: ${apiMessage.move.toString()}");
ChessBloc.getInstance()
.add(InvalidMovePlayed(move: ChessMove.fromApiMove(apiMessage.move!)));
ChessBloc.getInstance().add(
InvalidMovePlayed(
move: ChessMove.fromApiMove(apiMessage.move!),
squareInCheck:
ChessCoordinate.fromApiCoordinate(apiMessage.squareInCheck!),
),
);
}
}

View File

@ -114,6 +114,33 @@ Map<ChessPieceAssetKey, String> chessPiecesShortName = {
): '-',
};
Map<ChessPieceAssetKey, String> pieceCharacter = {
ChessPieceAssetKey(pieceClass: ChessPieceClass.pawn, color: ChessColor.white):
"",
ChessPieceAssetKey(pieceClass: ChessPieceClass.rook, color: ChessColor.white):
"",
ChessPieceAssetKey(
pieceClass: ChessPieceClass.knight, color: ChessColor.white): "",
ChessPieceAssetKey(
pieceClass: ChessPieceClass.bishop, color: ChessColor.white): "",
ChessPieceAssetKey(pieceClass: ChessPieceClass.king, color: ChessColor.white):
"",
ChessPieceAssetKey(
pieceClass: ChessPieceClass.queen, color: ChessColor.white): "",
ChessPieceAssetKey(pieceClass: ChessPieceClass.pawn, color: ChessColor.black):
"♟︎",
ChessPieceAssetKey(pieceClass: ChessPieceClass.rook, color: ChessColor.black):
"",
ChessPieceAssetKey(
pieceClass: ChessPieceClass.knight, color: ChessColor.black): "",
ChessPieceAssetKey(
pieceClass: ChessPieceClass.bishop, color: ChessColor.black): "",
ChessPieceAssetKey(pieceClass: ChessPieceClass.king, color: ChessColor.black):
"",
ChessPieceAssetKey(
pieceClass: ChessPieceClass.queen, color: ChessColor.black): "",
};
Map<String, ChessPiece> pieceFromShortname = {
'P': ChessPiece(ChessPieceClass.pawn, ChessColor.white),
'R': ChessPiece(ChessPieceClass.rook, ChessColor.white),
@ -171,6 +198,10 @@ class ChessCoordinate {
return ChessCoordinate(column, row);
}
factory ChessCoordinate.none() {
return ChessCoordinate(0, 0);
}
@override
int get hashCode {
return hash2(column, row);

View File

@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mchess/chess_bloc/chess_bloc.dart';
import 'package:mchess/chess_bloc/chess_position.dart';
import 'package:mchess/utils/chess_utils.dart';
class MoveHistory extends StatefulWidget {
const MoveHistory({super.key});
@override
State<MoveHistory> createState() => _MoveHistoryState();
}
class _MoveHistoryState extends State<MoveHistory> {
late List<String> entries;
@override
void initState() {
entries = [];
super.initState();
}
@override
Widget build(BuildContext context) {
return BlocListener<ChessBloc, ChessBoardState>(
listener: (context, state) {
List<String> newEntries = [];
var positionManager = ChessPositionManager.getInstance();
var allMoves = positionManager.allMoves;
for (ChessMove move in allMoves) {
var movedPiece = positionManager.getPieceAt(move.to);
var char = pieceCharacter[ChessPieceAssetKey(
pieceClass: movedPiece!.pieceClass,
color: movedPiece.color.getOpposite())];
if (movedPiece.color == ChessColor.white) {
newEntries.add("$char ${move.to.toAlphabetical()}");
} else {
newEntries.last =
"${newEntries.last}\t\t$char${move.to.toAlphabetical()}";
}
}
setState(() {
entries = newEntries;
});
},
child: ListView(children: [
for (var entry in entries) Text(entry),
]),
);
}
}

View File

@ -53,10 +53,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev"
source: hosted
version: "1.17.2"
version: "1.18.0"
crypto:
dependency: transitive
description:
@ -69,10 +69,10 @@ packages:
dependency: "direct main"
description:
name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
url: "https://pub.dev"
source: hosted
version: "1.0.5"
version: "1.0.6"
fake_async:
dependency: transitive
description:
@ -98,18 +98,18 @@ packages:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.0.3"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: "6ff8c902c8056af9736de2689f63f81c42e2d642b9f4c79dbf8790ae48b63012"
sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338"
url: "https://pub.dev"
source: hosted
version: "2.0.6"
version: "2.0.7"
flutter_test:
dependency: "direct dev"
description: flutter
@ -124,18 +124,18 @@ packages:
dependency: "direct main"
description:
name: go_router
sha256: bd7e671d26fd39c78cba82070fa34ef1f830b0e7ed1aeebccabc6561302a7ee5
sha256: "5668e6d3dbcb2d0dfa25f7567554b88c57e1e3f3c440b672b24d4a9477017d5b"
url: "https://pub.dev"
source: hosted
version: "6.5.9"
version: "10.1.2"
http:
dependency: "direct main"
description:
name: http
sha256: "4c3f04bfb64d3efd508d06b41b825542f08122d30bda4933fb95c069d22a4fa3"
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.1.0"
http_parser:
dependency: transitive
description:
@ -212,10 +212,10 @@ packages:
dependency: transitive
description:
name: petitparser
sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
sha256: eeb2d1428ee7f4170e2bd498827296a18d4e7fc462b71727d111c0ac7707cfa6
url: "https://pub.dev"
source: hosted
version: "5.4.0"
version: "6.0.1"
provider:
dependency: transitive
description:
@ -245,22 +245,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.10.0"
sprintf:
dependency: transitive
description:
name: sprintf
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.dev"
source: hosted
version: "1.11.0"
version: "1.11.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.1.2"
string_scanner:
dependency: transitive
description:
@ -281,10 +289,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
version: "0.6.1"
typed_data:
dependency: transitive
description:
@ -297,34 +305,34 @@ packages:
dependency: "direct main"
description:
name: uuid
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
sha256: e03928880bdbcbf496fb415573f5ab7b1ea99b9b04f669c01104d085893c3134
url: "https://pub.dev"
source: hosted
version: "3.0.7"
version: "4.0.0"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: b96f10cbdfcbd03a65758633a43e7d04574438f059b1043104b5d61b23d38a4f
sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f"
url: "https://pub.dev"
source: hosted
version: "1.1.6"
version: "1.1.7"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "57a8e6e24662a3bdfe3b3d61257db91768700c0b8f844e235877b56480f31c69"
sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f"
url: "https://pub.dev"
source: hosted
version: "1.1.6"
version: "1.1.7"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "7430f5d834d0db4560d7b19863362cd892f1e52b43838553a3c5cdfc9ab28e5b"
sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e"
url: "https://pub.dev"
source: hosted
version: "1.1.6"
version: "1.1.7"
vector_math:
dependency: transitive
description:
@ -353,10 +361,10 @@ packages:
dependency: transitive
description:
name: xml
sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84"
sha256: af5e77e9b83f2f4adc5d3f0a4ece1c7f45a2467b695c2540381bac793e34e556
url: "https://pub.dev"
source: hosted
version: "6.3.0"
version: "6.4.2"
sdks:
dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=3.7.0-0"
dart: ">=3.1.0 <4.0.0"
flutter: ">=3.7.0"

View File

@ -16,10 +16,10 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.0+1
version: 1.0.1
environment:
sdk: '>=2.19.0-392.0.dev <3.0.0'
sdk: ^3.1.0
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
@ -38,12 +38,12 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
flutter_bloc: ^8.1.1
flutter_bloc: ^8.1.3
quiver: ^3.1.0
web_socket_channel: ^2.2.0
go_router: ^6.0.0
go_router: ^10.1.0
http: ^1.0.0
uuid: ^3.0.7
uuid: ^4.0.0
dev_dependencies:
flutter_test:

View File

@ -13,7 +13,7 @@ import 'package:uuid/uuid.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(ChessGame(
await tester.pumpWidget(const ChessGame(
playerID: UuidValue("test"),
lobbyID: UuidValue("testLobbyId"),
passphrase: 'test',