在简单应用程序中调用Navigator.push()时,_debugLocked断言失败

时间:2020-02-12 19:45:57

标签: flutter dart

我正在尝试创建一个简单的第一个应用程序,以一组TabBar选项卡为中心。我希望这些选项卡中的一个包含一个按钮,单击该按钮后将启动一个模式,这似乎有必要将小部件推到导航堆栈中。

选项卡中的东西工作正常,但是尝试推送模式窗口小部件会导致'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2330 pos 12: '!_debugLocked': is not true.,该代码用于“防止再次进入呼叫推送,弹出和好友”。

关于这种方法的任何事情看起来显然是错误的吗?我将文本小部件替换为实际的模式,以简化对错误源的跟踪。

class SessionsView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Timer(),
        ]);
  }
}

class Timer extends StatefulWidget {
  @override
  State<Timer> createState() => _Timer();
}

class _Timer extends State<Timer> {

  Duration timerDuration;

  @override
  void initState() {
    super.initState();
    timerDuration = Duration(seconds: 10);
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        TimerIconButton(),
      ],
    );
  }
}

class TimerIconButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return IconButton(
      onPressed: launchTestModal(context),
      alignment: Alignment.centerLeft,
      icon: Icon(Icons.timelapse),
    );
  }
}

launchTestModal(BuildContext context) {
  Navigator.push(
      context,
      MaterialPageRoute<Null>(
        builder: (BuildContext context) {
          return Text('something');
        },
        fullscreenDialog: true,
      ));
}

1 个答案:

答案 0 :(得分:0)

您可以在下面复制粘贴运行完整代码
您需要使用WidgetsBinding.instance.addPostFrameCallback

代码段

launchTestModal(BuildContext context) {
  WidgetsBinding.instance.addPostFrameCallback((_) {
    Navigator.push(
        context,
        MaterialPageRoute<Null>(
          builder: (BuildContext context) {
            return Text('something');
          },
          fullscreenDialog: true,
        ));
  });
}

工作演示

enter image description here

完整代码

import 'package:flutter/material.dart';

class SessionsView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Timer(),
          ]),
    );
  }
}

class Timer extends StatefulWidget {
  @override
  State<Timer> createState() => _Timer();
}

class _Timer extends State<Timer> {
  Duration timerDuration;

  @override
  void initState() {
    super.initState();
    timerDuration = Duration(seconds: 10);
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        TimerIconButton(),
      ],
    );
  }
}

class TimerIconButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return IconButton(
      onPressed: launchTestModal(context),
      alignment: Alignment.centerLeft,
      icon: Icon(Icons.timelapse),
    );
  }
}

launchTestModal(BuildContext context) {
  WidgetsBinding.instance.addPostFrameCallback((_) {
    Navigator.push(
        context,
        MaterialPageRoute<Null>(
          builder: (BuildContext context) {
            return Text('something');
          },
          fullscreenDialog: true,
        ));
  });
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SessionsView(),
    );
  }
}
相关问题