[英]Error thrown in flutter app on navigator '!navigator._debugLocked': is not true
通过单击主屏幕上的按钮移动到登录屏幕时,会引发此错误。 我不明白为什么会这样。 正如模拟器中显示的错误消息一样,我访问了https://flutter.dev/docs/testing/errors但在那里也搞不清楚。
class Body extends StatelessWidget {
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
//this provide total height and width of screen
return Background(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"WELCOME TO BATCHMATE",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: size.height * 0.07),
SvgPicture.asset(
'assets/icons/chat.svg',
height: size.height * 0.45,
),
FlatedButton(
text: 'LOGIN',
press: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return LoginScreen();
},
),
);
},
),
SizedBox(height: size.height * 0.01),
FlatedButton(
text: 'SIGN UP',
color: Colors.greenAccent,
textColor: Colors.black87,
press: () {},
),
],
),
),
);
}
}
这是抛出的错误:
E/flutter ( 7445): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3022 pos 18: '!navigator._debugLocked': is not true.
E/flutter ( 7445): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:46:39)
E/flutter ( 7445): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
E/flutter ( 7445): #2 _RouteEntry.handlePush.<anonymous closure> (package:flutter/src/widgets/navigator.dart:3022:18)
E/flutter ( 7445): #3 TickerFuture.whenCompleteOrCancel.thunk (package:flutter/src/scheduler/ticker.dart:407:15)
E/flutter ( 7445): #4 _rootRunUnary (dart:async/zone.dart:1436:47)
E/flutter ( 7445): #5 _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter ( 7445): <asynchronous suspension>
E/flutter ( 7445): #6 TickerFuture.whenCompleteOrCancel.thunk (package:flutter/src/scheduler/ticker.dart)
E/flutter ( 7445): <asynchronous suspension>
我以这种方式处理路线,也许它可以帮助您解决问题。
一开始它有点复杂,但一旦你了解它是如何工作的,它就会节省很多时间。
在您的每个屏幕上添加一个 static 常量,使用您想要的任何名称,我通常称它们为 screenId。
static const String screenId = 'screen_name';
创建一个名为 routeGenerator 的文件,您将在其中放置应用程序拥有的所有路由。
import 'package:flutter/material.dart';
import 'main.dart';
import 'screens/chat_screen.dart';
import 'screens/login_screen.dart';
import 'screens/email_registration_screen.dart';
import 'screens/welcome_screen.dart';
class RouteGenerator {
static Route<dynamic> generateRoute(RouteSettings settings) {
final args = settings.arguments;
switch (settings.name) {
case WelcomeScreen.screenId:
return MaterialPageRoute(
builder: (_) => WelcomeScreen(),
);
case EmailRegistrationScreen.screenId:
return MaterialPageRoute(
builder: (_) => EmailRegistrationScreen(),
);
case LoginScreen.screenId:
return MaterialPageRoute(
builder: (_) => LoginScreen(),
);
case ChatScreen.screenId:
return MaterialPageRoute(
builder: (_) => ChatScreen(),
);
default:
return _errorRoute();
}
}
static Route<dynamic> _errorRoute() {
return MaterialPageRoute(builder: (_) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('404'),
RaisedButton(
onPressed: () {
navigatorKey.currentState.pop();
},
child: Text('Regresar'),
),
],
),
),
);
});
}
}
然后在你的 main.dart 上你添加一个全局密钥和一些参数到你的 MaterialApp();
import 'route_generator.dart';
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: WelcomeScreen.screenId,
onGenerateRoute: RouteGenerator.generateRoute,
navigatorKey: navigatorKey,
);
}
}
要导航到屏幕,您可以添加屏幕的 static 常量以导航到该特定屏幕。
LongButton(
text: 'Regístrate',
color: Colors.blueAccent,
callback: () {
Navigator.pushNamed(context, EmailRegistrationScreen.screenId);
},
),
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.