Снэк-бар отображается после нажатия кнопки назад - PullRequest
0 голосов
/ 11 июня 2019

Поток: пользователь нажимает на ссылку с экрана 1, чтобы перейти к экрану 2. На экране 2 пользователь вводит необходимые данные и нажимает кнопку «Сохранить», которая сохраняет данные, и переходит к экрану 1, где я хочу отобразить «снэк-бар».

Это звучит очень похоже на это и это сообщение, но оно не работает для меня. Итак, я следовал этому образцу кода, который работает правильно, но есть одна проблема.

Если я нажимаю кнопку «Назад» на панели приложений или кнопку «Назад» на экране устройства 2, она все равно отображает снэк-бар на экране 1. Интересно, как можно избежать такого поведения, когда не отображается снэк-бар после нажатия кнопок назад.

После того, как пользователь сохраняет данные на экране 2, я просто использую Navigator.pop(context), который переводит пользователя на экран 1. На экране 1 у меня есть метод, который переходит к экрану 2 и запускает снэк-бар, как показано ниже:

Navigator.push(
      context, MaterialPageRoute(builder: (context) => Screen2())
    );
    scaffoldKey.currentState.showSnackBar(SnackBar(content: Text('Show me'),));

Хотя это работает, я не хочу показывать снэк-бар, если пользователь нажимает кнопку назад.

1 Ответ

0 голосов
/ 11 июня 2019

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

Решение - добавить этот метод перед Навигатором:

Scaffold.of(context).removeCurrentSnackBar();

В вашем случае вы используете scaffoldKey, поэтому переводите его, как вам нужно.Но убедитесь, что вы связываетесь с правым эшафотом.

scaffoldKey.currentState.removeCurrentSnackBar();

Официальная ссылка: https://api.flutter.dev/flutter/material/ScaffoldState/removeCurrentSnackBar.html

Редактировать: О вызове экрана 1 Эшафот внутри экрана 2 Эшафот:

На вашем экране есть помосты.У лесов есть ключи в вашей ситуации, как я вижу.

Допустим, у Screen1 есть ключ screen1Key ScaffoldState.То же самое для Screen2.

Внутри Screen2 вы должны позвонить

screen1Key.currentState.removeCurrentSnackBar();
full example:

import 'package:flutter/material.dart';

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

GlobalKey<ScaffoldState> screen1Key = GlobalKey<ScaffoldState>();
GlobalKey<ScaffoldState> screen2Key = GlobalKey<ScaffoldState>();

class Screen1 extends StatefulWidget {
  @override
  _Screen1State createState() => _Screen1State();
}

class _Screen1State extends State<Screen1> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: screen1Key,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            RaisedButton(
              onPressed: () {
                screen1Key.currentState
                    .showSnackBar(SnackBar(content: Text('Screen 1 SnackBar')));
              },
              child: Text('Show SnackBar'),
            ),
            RaisedButton(
              onPressed: () {
                Navigator.push(context, MaterialPageRoute(builder: (context) {
                  return Screen2();
                }));
              },
              child: Text('Navigate forward'),
            ),
          ],
        ),
      ),
    );
  }
}

class Screen2 extends StatefulWidget {
  @override
  _Screen2State createState() => _Screen2State();
}

class _Screen2State extends State<Screen2> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: screen2Key,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            RaisedButton(
              onPressed: () {
                screen2Key.currentState
                    .showSnackBar(SnackBar(content: Text('Screen 2 SnackBar')));
              },
              child: Text('Show SnackBar'),
            ),
            RaisedButton(
              onPressed: () {
                screen1Key.currentState.removeCurrentSnackBar();
                Navigator.pop(context);
              },
              child: Text('Navigate Back'),
            ),
          ],
        ),
      ),
    );
  }
}

Надеюсь, я хорошо понимаю вашу проблему.

...