diff --git a/lib/src/widgets/board.dart b/lib/src/widgets/board.dart index 0e9c104d4c..e8795ebf04 100644 --- a/lib/src/widgets/board.dart +++ b/lib/src/widgets/board.dart @@ -30,12 +30,27 @@ class BoardWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final safeFen = fen.trim().isNotEmpty ? fen : Setup.standard.fen; + final Chess position = Chess.fromSetup(Setup.parseFen(safeFen)); + // ✅ Safe fallback for spectator mode + final effectiveGameData = + gameData ?? + GameData( + playerSide: PlayerSide.none, // spectator cannot move + sideToMove: position.turn, // doesn’t matter, just required + validMoves: IMap(), // no valid moves + promotionMove: null, + isCheck: position.isCheck, + premovable: null, + onMove: (_, {isDrop}) {}, // no-op + onPromotionSelection: (_) {}, // no-op + ); final board = Chessboard( key: boardKey, size: size, - fen: fen, + fen: safeFen, orientation: orientation, - game: gameData, + game: effectiveGameData, lastMove: lastMove, shapes: shapes, settings: settings, diff --git a/lib/src/widgets/game_layout.dart b/lib/src/widgets/game_layout.dart index 34561d75f9..d60f322403 100644 --- a/lib/src/widgets/game_layout.dart +++ b/lib/src/widgets/game_layout.dart @@ -155,7 +155,9 @@ class _GameLayoutState extends ConsumerState { final shapes = userShapes.union(widget.shapes ?? ISet()); final slicedMoves = widget.moves?.asMap().entries.slices(2); - final fen = widget.interactiveBoardParams?.position.fen ?? widget.fen!; + final fenCandidate = widget.interactiveBoardParams?.position.fen ?? widget.fen; + final fen = (fenCandidate?.isNotEmpty ?? false) ? fenCandidate! : Setup.standard.fen; + final gameData = widget.interactiveBoardParams != null ? boardPrefs.toGameData( variant: widget.interactiveBoardParams!.variant,