繁体   English   中英

导航器“.navigator:_debugLocked”上的 flutter 应用程序中引发的错误:不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM