【问题标题】:How to fix the '!_debugLocked': is not true in flutter?如何修复'!_debugLocked':在颤动中不正确?
【发布时间】:2020-12-23 18:11:43
【问题描述】:

我是 Flutter 新手,导航有问题。我的应用有多个页面,我无法理解错误以及如何修复它。

我在网上搜索并尝试了我在 Git/Stack 或 Google 上找到的所有内容,但没有任何效果。

这是错误:'!_debugLocked': is not true.

这是代码:

这是第一个 .dart 文件,错误是当我尝试执行 Navigator.of ..... 导入'package:flutter/material.dart';

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[100],
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          SizedBox(
            height: 320,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'C.R',
                style: TextStyle(
                  fontSize: 120,
                  fontFamily: 'Membra',
                ),
              )
            ],
          ),
          SizedBox(
            height: 200,
          ),
          FloatingActionButton(
            backgroundColor: Colors.white,
            child: Image.asset('images/arrow_next.png'),
            onPressed: () {
              Navigator.of(context).pushNamedAndRemoveUntil(
                  '/SecondScreen', (Route<dynamic> route) => false);
            },
          ),
        ],
      ),
    );
  }
}

这是我想从第一个文件/页面转到的第二个 .dart 文件。

import 'package:flutter/material.dart';

import 'NewWidget_Creator.dart';

class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Center(
            child: NewWidget(
                'Schede',
                Navigator.of(context).pushNamedAndRemoveUntil(
                    '/SecondScreen', (Route<dynamic> route) => false)),
          ),
          NewWidget(
              'Orario',
              Navigator.of(context).pushNamedAndRemoveUntil(
                  '/SecondScreen', (Route<dynamic> route) => false)),
          NewWidget(
              'Pausa',
              Navigator.of(context).pushNamedAndRemoveUntil(
                  '/SecondScreen', (Route<dynamic> route) => false)),
        ],
      ),
    );
  }
}

NewWidgetCreator .dart 文件:

import 'package:flutter/material.dart';

class NewWidget extends StatelessWidget {
  String Name_of_button;
  Future<dynamic> send_toNextPage;
  NewWidget(this.Name_of_button, this.send_toNextPage);

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: () {
        send_toNextPage;
      },
      child: Container(
        child: Text(
          Name_of_button,
          textAlign: TextAlign.center,
          style: TextStyle(
            fontFamily: 'Membra',
            fontSize: 50,
          ),
        ),
      ),
    );
  }
}

提前谢谢你。

【问题讨论】:

  • 你能告诉我们NewWidget_Creator.dart里面是什么吗?你不觉得,你过度使用pushNamedAndRemoveUntil吗?为什么要删除导航器堆栈中的所有路由?使用Navigator.of(context).pushNamed('/SecondScreen')不是更方便吗?
  • 我发布了 newWidget_Creator.dart 文件并使用了 Navigator.of(context).pushNamed('/SecondScreen') 但我得到了同样的错误
  • 是的,我知道它不会影响问题,但也许它会让你知道你想要什么:)

标签: flutter flutter-navigation


【解决方案1】:

为什么在NewWidget 字段中send_toNextPage 是一个Future?在这里你有固定的NewWidget

class NewWidget extends StatelessWidget {
  String buttonName;
  String nextPageRoute;
  NewWidget(this.buttonName, this.nextPageRoute);

  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: () {
        Navigator.of(context).pushNamed(nextPageRoute);
      },
      child: Container(
        child: Text(
          buttonName,
          textAlign: TextAlign.center,
          style: TextStyle(
            fontFamily: 'Membra',
            fontSize: 50,
          ),
        ),
      ),
    );
  }
}

这是SeconScreen中的使用方法:

class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          NewWidget('Schede', '/SecondScreen'),
          NewWidget('Orario', '/SecondScreen'),
          NewWidget('Pausa', '/SecondScreen'),
        ],
      ),
    );
  }
}

顺便说一句:SecondSreen 可以是StatelessWidget

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          NewWidget('Schede', '/SecondScreen'),
          NewWidget('Orario', '/SecondScreen'),
          NewWidget('Pausa', '/SecondScreen'),
        ],
      ),
    );
  }
}

【讨论】:

  • 您好,感谢您帮我解决问题。我使用 send_toNextPage 作为未来,因为我检查了 Navigator 是什么,它是 Future 但我可以看到这个游戏我出错了,下次我会更加小心。
猜你喜欢
  • 2022-01-07
  • 2019-08-30
  • 2021-08-26
  • 2020-11-11
  • 2022-01-24
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多