Flutter中AppBar内按钮无法访问Navigator的问题求助
核心原因很简单:你当前用的context不属于MaterialApp的内部上下文,找不到它提供的Navigator服务。
通俗理解Context的作用
Flutter里的每个Widget都有自己的context,可以把它看成Widget的"层级地址牌"——通过这个地址,Widget能找到它上层父Widget提供的各种服务(比如Navigator、主题样式这些)。
你的代码里,MyApp的build方法里的context,是MyApp这个Widget的地址牌。而MaterialApp是你在这个方法里返回的子Widget,相当于MyApp是MaterialApp的"父级"。
但Navigator是MaterialApp内部生成并提供的服务,只有MaterialApp下方的子Widget的context,才能顺着层级找到这个服务。你现在用的是父级(MyApp)的context,自然搜不到子级(MaterialApp)手里的Navigator。
两种解决方法
方法1:把主页抽成独立Widget
把原来的Scaffold单独拆成一个新的Widget(比如叫HomePage),这样这个新Widget的context就属于MaterialApp的内部层级,就能正常访问Navigator了:
import 'package:flutter/material.dart'; import 'package:new_app/pages/first_page.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); } } class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( actions: [ IconButton( icon: Icon( Icons.arrow_forward_ios, color: Colors.black, ), onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (context) => FirstPage())); }, ) ]), body: Center( child: Text('Sample Text'), ), ); } }
方法2:用Builder包裹Scaffold
如果不想拆Widget,可以用Builder组件包裹Scaffold,它会自动提供一个属于MaterialApp内部的context:
import 'package:flutter/material.dart'; import 'package:new_app/pages/first_page.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Builder( builder: (innerContext) { return Scaffold( appBar: AppBar( actions: [ IconButton( icon: Icon( Icons.arrow_forward_ios, color: Colors.black, ), onPressed: () { Navigator.push(innerContext, MaterialPageRoute(builder: (context) => FirstPage())); }, ) ]), body: Center( child: Text('Sample Text'), ), ); }, ), ); } }
内容的提问来源于stack exchange,提问作者Jo Jo
相关产品推荐
相关产品推荐

