.popUntil с вложенными навигаторами - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь использовать .popUntil, но получаю! _DebugLocked - неверное утверждение. Все решения онлайн не смогли мне помочь. Я верю, что так я настраиваю навигацию.

Ниже приведен мой файл main.dart, мой route.dart (файл навигатора) и мой файл pages.dart. Обратите внимание, что это упрощенная версия моего кода. Тем не менее, структура похожа на мой фактический код. Структура моего кода должна измениться, потому что в моем коде используются вложенные навигаторы!

main.dart

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(debugShowCheckedModeBanner: false, home: Routes());
  }
}

rout.dart

import 'package:flutter/material.dart';
import 'package:honeybee_flutter/screens/test/pages.dart';

class Routes extends StatelessWidget {

  Routes({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Navigator(
        initialRoute: 'route/one',
        onGenerateRoute: (RouteSettings settings) {
          switch (settings.name) {
            case 'route/one':
              return MaterialPageRoute(builder: (_) => Route1());
            case 'route/two':
              return MaterialPageRoute(builder: (_) => Route2());
            case 'route/three':
              return MaterialPageRoute(builder: (_) => Route3());
            default:
              throw MaterialPageRoute(builder: (_) => Route1());
          }
        });
  }
}

pages.dart

import 'package:flutter/material.dart';

class Route1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FlatButton(
              onPressed: () => Navigator.pushNamed(context, 'route/two'),
              child: Text('route/one'))),
    );
  }
}

class Route2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FlatButton(
              onPressed: () => Navigator.pushNamed(context, 'route/three'),
              child: Text('route/two'))),
    );
  }
}

class Route3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FlatButton(
              onPressed: () =>
                  Navigator.popUntil(context, ModalRoute.withName('route/one')), // This doesn't work, gives me !_debugLocked is not true
              child: Text('route/three'))),
    );
  }
}

При использовании popUntil в Route3 для возврата к Route1 я получаю ошибку! _DebugLocked. Я пытался использовать это решение ( Ошибка, генерируемая во всплывающем окне навигатора, до тех пор, пока: «! _DebugLocked»: не соответствует действительности. »), но я получу черный экран и« Следующее StateError было сгенерировано во время обратного вызова планировщика: flutter: Плохое состояние: Будущее уже завершено 'ошибка.

Я также пытался pushNamedAndRemoveUntil, но это не вернется назад правильно. Например, я выскочу из Route3 в Route2 следующим образом:


class Route3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
          child: FlatButton(
              onPressed: () => Navigator.pushNamedAndRemoveUntil(
                  context, 'route/two', ModalRoute.withName('route/one')),
              child: Text('route/three'))),
    );
  }
}

Я нажимаю на маршрут два и удаляю все маршруты до маршрута один. Однако, когда я нажимаю на маршрут 2, а затем нажимаю кнопку «Назад», чтобы открыть .pop, я просто получаю черный экран вместо того, чтобы идти по маршруту 1.

Не уверен, почему это происходит.

Любая помощь приветствуется. Спасибо

...