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

如何从Flutter Flame Engine游戏widget跳转至外部其他Flutter widget

问题解答

可以实现从Flame GameWidget跳转至其他Flutter Widget,你当前代码无法直接导航的核心原因是根节点没有使用MaterialApp/CupertinoApp,缺少导航所需的Navigator上下文,按以下步骤修改即可:


步骤1:修改main.dart结构,补全导航上下文

调整根组件结构,引入MaterialApp提供导航能力,你可以直接传上下文给Game实例,也可以配置命名路由统一管理跳转:

import 'package:flame/flame.dart';
import 'package:flame/game.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'my_game.dart';
// 导入你要跳转的目标页面
import 'target_page.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: GameWidget(
          game: MyGame(context: context),
        ),
      ),
      // 可选配置命名路由
      routes: {
        '/target': (context) => TargetPage(),
      },
    );
  }
}

步骤2:修改my_game.dart,调用导航API

给MyGame类新增上下文接收属性,在需要触发跳转的位置直接调用Flutter导航方法即可:

import 'package:flame/extensions.dart';
import 'package:flame/game.dart';
import 'package:flame/gestures.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

class MyGame extends BaseGame with TapDetector {
    // 新增上下文属性和构造方法
    final BuildContext context;
    MyGame({required this.context});

    @override
    void update(double dt) { /* TODO */ }

    @override
    void render(Canvas canvas) { /* TODO */ }

    @override
    void onTapUp(TapUpDetails details) {
        // 跳转命名路由
        Navigator.pushNamed(context, '/target');
        // 也可以直接构造页面跳转
        // Navigator.push(context, MaterialPageRoute(builder: (context) => TargetPage()));
    }
}

可选解耦方案:使用回调函数

如果不想让Game类依赖Flutter的BuildContext,降低耦合方便后续跨端移植,可以用回调实现跳转:

调整my_game.dart代码

class MyGame extends BaseGame with TapDetector {
    // 定义跳转回调
    final VoidCallback onNavigate;
    MyGame({required this.onNavigate});

    @override
    void onTapUp(TapUpDetails details) {
        // 触发跳转回调
        onNavigate();
    }
}

调整main.dart初始化逻辑

GameWidget(
  game: MyGame(
    onNavigate: () {
      Navigator.pushNamed(context, '/target');
    },
  ),
)

版本适配说明

你当前使用的flame-1.0.0-rc8、Flutter2.2.3版本完全兼容上述逻辑,无需额外调整API,如果后续升级到flame正式版,仅需要把BaseGame替换为FlameGame即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:21:03