6

我正在为应用程序创建加载屏幕。此加载屏幕是向用户显示的第一个屏幕。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 之前添加,但这不起作用。这将显示一个空白的黑屏。

有任何想法吗??

4

2 回答 2

18

您需要使用 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(),
        ),
      );
于 2019-04-11T07:10:57.723 回答
4

是的,我发现了和你一样的问题。replace 的问题是它只能工作一次,但我不知道为什么它不能正常工作。为此经过几次尝试,我阅读了官方指南,并且存在此方法: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
            );
于 2019-10-04T08:13:44.397 回答