Как передать данные другому окну и запретить возвращаться назад?

У меня есть 2 окна.Первое это, например, loginScreen().В нём я хочу перейти на второе окно mainScreen() и передать туда данные:

Navigator.push(
    context,
    MaterialPageRoute(
        builder: (context) => MainScreen(token: "qwerty"),
    )
);

Но из-за Navigator.push сверху слева появляется кнопка назад

image

Почитал,что эту кнопку можно убрать при помощи

AppBar(
    automaticallyImplyLeading: false
)

Но тогда при нажатии аппаратной кнопки назад, он всё равно возвращается на первое окно loginScreen().Как мне тогда менять окно?


Ответы (1 шт):

Автор решения: MiT

Используйте WillPopScope, если он возвращает false, то переход назад по нажатию системной кнопкой будет проигнорировано.

import 'dart:async';

import 'package:flutter/material.dart';

class MainScreen extends StatefulWidget {
  MainScreen({Key key, this.title}) :super(key: key);

  final String title;

  @override
  State<StatefulWidget> createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {

  Future<bool> _onWillPop() async {
    return false;
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        return false;
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text("Main Screen"),
          automaticallyImplyLeading: false,
        ),
        body: Center(
          child: Text("Main Screen"),
        ),
      ),
    );
  }
}

А вам точно нужен Navigator.push? Просто для вашего случая больше подходит Navigator.pushAndRemoveUntil, который удалит предыдущую историю навигации. Вот пример:

Navigator.pushAndRemoveUntil(
    context,
    MaterialPageRoute(
        builder: (context) => MainScreen(token: "qwerty"),
    ),
    (Route<dynamic> route) => false,
);
→ Ссылка