Панель приложений мерцает при использовании Navigator.of(контекст).pushNamedAndRemoveUntil()

#flutter #dart

#flutter #dart

Вопрос:

Я пытаюсь очистить все предыдущие маршруты после того, как пользователь вошел в мое приложение. Однако у меня возникла проблема со следующим кодом в моем приложении Flutter:

 void clearRoutes()
  {
    //createLinks();
    Navigator.of(context).pushNamedAndRemoveUntil('/my_home', (Route<dynamic> route) => false);
  }

  Widget build(BuildContext context)
  {
    WidgetsBinding.instance.addPostFrameCallback((_) => clearRoutes());

    return Scaffold(
          appBar: AppBar(
            centerTitle: true,
            title: Text("iWhiz Home"),
          ),
          body: ListView.builder(
              itemCount: links.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(links[index]),
                );
              }
          ),
        );
  }
 

Приведенный выше код приводит к этой проблеме:

введите описание изображения здесь

Строка кода, которая вызывает у меня эту проблему, такова Navigator.of(context).pushNamedAndRemoveUntil('/my_home', (Route<dynamic> route) => false);

Можно ли решить эту проблему?

Ответ №1:

Я смог найти решение. Это код, который вызывал у меня проблему:

 class Login extends StatelessWidget
{
  void homePage(BuildContext context)
  {
    Navigator.pushNamed(context, "/my_home");
  }

  Widget build(BuildContext context)
  {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("Login"),
      ),
      body: Center(
          child:
          Column(
            children: [
              Text("Welcome to the Login Page"),
              ElevatedButton(
                onPressed: ()
                {
                  homePage(context);
                },
                child: Text("Login"),
              ),
            ],
          )
      ),
    );
  }
}
 
 class MyHome extends StatelessWidget
{
  void removePreviousRoutes(BuildContext context)
  {
    //The problem code.
    Navigator.of(context).pushNamedAndRemoveUntil('/my_home', (Route<dynamic> route) => false);
  }

  Widget build(BuildContext context)
  {
    WidgetsBinding.instance.addPostFrameCallback((_) => removePreviousRoutes(context));

    return Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: Text("My Home"),
        ),
        body: Center(
          child:
          Text("Welcome to the Home Page"),
        )
    );
  }
}
 

Начальная страница, которая будет отображаться, — это Login . После того, как пользователь нажмет «Добро пожаловать на страницу входа», он будет перенаправлен на страницу MyHome. Проблема возникает Navigator.of(context).pushNamedAndRemoveUntil('/my_home', (Route<dynamic> route) => false); на странице MyHome.

Решение:

 class Login extends StatelessWidget
{
  void homePage(BuildContext context)
  {
    //The solution.
    Navigator.pushNamed(context, "/my_home");

    Navigator.of(context).pushNamedAndRemoveUntil('/my_home', (Route<dynamic> route) => false);
  }

  Widget build(BuildContext context)
  {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("Login"),
      ),
      body: Center(
          child:
          Column(
            children: [
              Text("Welcome to the Login Page"),
              ElevatedButton(
                onPressed: ()
                {
                  homePage(context);
                },
                child: Text("Login"),
              ),
            ],
          )
      ),
    );
  }
}

class MyHome extends StatelessWidget
{
  Widget build(BuildContext context)
  {
    return Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: Text("My Home"),
        ),
        body: Center(
          child:
          Text("Welcome to the Home Page"),
        )
    );
  }
}
 

Решение состояло в том, чтобы ввести новый маршрут и удалить все предыдущие маршруты из Login, ВМЕСТО того, ЧТОБЫ вводить новый маршрут в Login и удалять предыдущие маршруты из регистрации. После этого я больше не получал проблему с мерцанием.