我有一个需要登录才能继续的应用程序(例如Google)。
当需要身份验证时,我想重定向用户。
但是,当我运行一个Navigator.of(context).pushNamed("myroute")。我收到以下错误:
Navigator.of(context).pushNamed("myroute")
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter ( 5624): The following assertion was thrown building _ModalScopeStatus(active): I/flutter ( 5624): setState() or markNeedsBuild() called during build. I/flutter ( 5624): This Overlay widget cannot be marked as needing to build because the framework is already in the I/flutter ( 5624): process of building widgets. A widget can be marked as needing to be built during the build phase I/flutter ( 5624): only if one of its ancestors is currently building. This exception is allowed because the framework I/flutter ( 5624): builds parent widgets before children, which means a dirty descendant will always be built. I/flutter ( 5624): Otherwise, the framework might not visit this widget during this build phase.
这是示例代码
void main() { runApp(new MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new MyHomePage(title: 'Flutter Demo Home Page'), routes: <String, WidgetBuilder> { "login" : (BuildContext context) => new LoginPage(), } ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; @override void initState() { super.initState(); if(!isLoggedIn) { print("not logged in, going to login page"); Navigator.of(context).pushNamed("login"); } } void _incrementCounter() { setState(() { _counter++; }); } void test() { print("hello"); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: new Center( child: new Text( 'Button tapped $_counter time${ _counter == 1 ? '' : 's' }.', ), ), floatingActionButton: new FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: new Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } } class LoginPage extends StatefulWidget { LoginPage({Key key, this.title}) : super(key: key); final String title; @override _LoginPageState createState() => new _LoginPageState(); } class _LoginPageState extends State<LoginPage> { @override Widget build(BuildContext context) { print("building login page"); return new Scaffold( appBar: new AppBar( title: new Text("Sign up / Log In"), ), ), ); } }
我想我做错了,也许是中止小部件的构建导致了这一问题。但是,我怎么能做到这一点。
基本上:“我进入我的页面,如果未登录,请进入登录页面”
谢谢,Alexi
尝试包装您的Navigator电话:
Navigator
Navigator.of(context).pushNamed("login");
在预定的回调中addPostFrameCallback:
addPostFrameCallback
SchedulerBinding.instance.addPostFrameCallback((_) { Navigator.of(context).pushNamed("login"); });
您需要在文件顶部进行此导入:
import 'package:flutter/scheduler.dart';
作为备选方案,考虑一下,如果你可以只具有MyHomePage的build()方法返回一个LoginPage代替Scaffold,如果用户没有登录。这可能会与返回键相互作用更好,因为你不希望用户支持的登录对话框中做出来在完成登录之前。
MyHomePage
build()
LoginPage
Scaffold