Как убрать первый экран из маршрута во Флаттере?

Я создаю загрузочный экран для приложения. Этот экран загрузки является первым экраном, который будет показан пользователю. Через 3 секунды страница перейдет на домашнюю страницу. все работает нормально. Но когда пользователь нажимает кнопку "Назад", снова отображается экран загрузки.

КОД ПЕРВОЙ СТРАНИЦЫ

import 'dart:async';
import 'package:flutter/material.dart';
import 'home_page.dart';

void main() {
  runApp(MaterialApp(
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    Future.delayed(
        Duration(
          seconds: 3,
        ), () {
      // Navigator.of(context).pop(); // THIS IS NOT WORKING
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => HomePage(),
        ),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlutterLogo(
          size: 400,
        ),
      ),
    );
  }
}

ДОМАШНИЙ КОД

import 'package:flutter/material.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('HomePage'),
        ),
      ),
    );
  }
}

Я пытался добавить Navigator.of(context).pop(); до вызова HomePage, но это не работает. Это покажет пустой черный экран.

Есть идеи??

1 ответ

Решение

Вам нужно использовать pushReplacement, а не просто метод push. Вы можете прочитать об этом здесь: https://docs.flutter.io/flutter/widgets/Navigator/pushReplacement.html

И чтобы решить вашу проблему, просто сделайте, как описано ниже. Просто замените этот код:

Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => HomePage(),
        ),
      );

с этим:

Navigator. pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => HomePage(),
        ),
      );

Да, я обнаружил ту же проблему, что и вы. Проблема с заменой в том, что она работает только один раз, но я не знаю, почему она не работает должным образом. Для этого после нескольких попыток я прочитал официальное руководство, и этот метод существует: pushAndRemoveUntil (). Фактически, нажмите на другой виджет и одновременно удалите все виджеты позади, включая текущий. Вы должны создать только один класс для управления своим корнем через строку. Вот пример:

class RouteGenerator {
  static const main_home= "/main";


  static Route<dynamic> generatorRoute(RouteSettings settings) {
  final args = settings.arguments;

  switch (settings.name) {

  case main_home:
    return MaterialPageRoute(builder: (_) => MainHome());
    break;

  }
 }
}

Этот класс необходимо добавить в Main в:

MaterialApp(onGenerateRoute: ->RouteGenerator.generatorRoute)

Теперь, чтобы использовать этот метод, просто напишите:

 Navigator.of(context).pushNamedAndRemoveUntil(
              RouteGenerator.main_home,
              (Route<dynamic> route) => false
            );
Другие вопросы по тегам