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

Flutter中FloatingActionButton跳转页面失效,报Context问题求助

问题原因与解决方案

问题根源

你当前使用的context是myapp组件的上下文,这个上下文位于MaterialApp的外部层级,无法访问到MaterialApp内部维护的导航器(Navigator),所以点击按钮后页面跳转无响应。

解决方案一:将首页Scaffold抽为独立组件

把原本直接写在MaterialApp的home参数里的Scaffold抽成单独的组件,这样组件内部的上下文就属于MaterialApp的子树,能正常调用导航方法:

import 'package:flutter/material.dart';
import 'package:kitchen/Screen/FoodScreen.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const HomeScreen(),
    );
  }
}

// 独立的首页组件
class HomeScreen extends StatelessWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white60,
      appBar: AppBar(
        backgroundColor: Colors.green,
        title: const Text('Teach'),
        actions: [
          IconButton(
            onPressed: () {},
            icon: const Icon(Icons.favorite),
          )
        ],
      ),
      body: const Center(
        child: Text('Add Content here'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => const FoodScreen()),
          );
        },
        backgroundColor: Colors.green,
        child: const Icon(Icons.add),
      ),
    );
  }
}

解决方案二:用Builder组件包裹Scaffold

如果不想新增组件,可以用Builder组件包裹Scaffold,Builder会提供一个属于MaterialApp子树的上下文,从而能正确访问导航器:

import 'package:flutter/material.dart';
import 'package:kitchen/Screen/FoodScreen.dart';

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

class myapp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Builder(
        builder: (context) { // 这里的context属于MaterialApp子树
          return Scaffold(
            backgroundColor: Colors.white60,
            appBar: AppBar(
              backgroundColor: Colors.green,
              title: const Text('Teach'),
              actions: [
                IconButton(onPressed:(){}, icon: const Icon(Icons.favorite),)
              ],
            ),
            body: const Center(child: Text('Add Content here')),
            floatingActionButton: FloatingActionButton(
              onPressed: (){
                Navigator.push(context, MaterialPageRoute(builder: (context)=>const FoodScreen()));
              },
              backgroundColor:Colors.green,
              child:const Icon(Icons.add),
            ),
          );
        },
      )
    );
  }
}

补充规范:完善FoodScreen组件

你的FoodScreen组件的build方法需要加上@override注解,符合Flutter代码规范:

import 'package:flutter/material.dart';

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

  @override
  Widget build(BuildContext context)
  {
    return const Scaffold(
        body:Center(child:Text('hello')));
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:37:42