Как активировать setState и snackBar нажатием одной кнопки? - PullRequest
0 голосов
/ 01 мая 2020

Итак, я делал случайное учебное приложение, и у меня была идея использовать snackBar при изменении состояния приложения. Но я всегда получаю исключение: «Scaffold.of () вызывается с контекстом, который не содержит Scaffold».

class _HomeState extends State<Home> {

  String _instrument;
  var _bal = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
          child: Column(
            children: <Widget>[
              Expanded(
                child: Text("Make Money"),
              ),

              Expanded(
                child: Text("Account Ballence : \n\$$_bal"),
              ),

              Expanded(
                child: Center(
                  child: RaisedButton(
                        child: Text("Gamble"),
                        onPressed: _gamble,
                  )  
                )
              )
            ],
          ),
        ));
  }

  void _gamble() {
    Random rnd = new Random();

    setState(() {
      _bal += rnd.nextInt(10000 - 0) - 4000;
    });

    Scaffold.of(context).showSnackBar(SnackBar(content: Text("Money Updated"),));
  }
}

Проблема, похоже, в функции _gamble. Есть ли альтернативный способ сделать это? Я попытался использовать Builder и вернуть RaisedButton, но это было то же исключение.

1 Ответ

0 голосов
/ 01 мая 2020

Если scaffold является родительским виджетом, то есть на одном уровне выше в дереве виджетов, тогда ваш код будет работать, но если вы хотите использовать scaffold на том же уровне, то вы должны использовать ScaffoldKey в качестве следующего кода.

Создать ключ scaffold .

 var _scaffoldKey = new GlobalKey<ScaffoldState>();

Назначить ключ на эшафот.

 Scaffold(
      key: _scaffoldKey,
      body: Center(

Теперь Показать SnackBar с помощью ScaffoldKey.

 _scaffoldKey.currentState.showSnackBar(SnackBar(
      content: Text("Money Updated"),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...