Текстовое поле, возвращающее значение null; в обход ожидания - PullRequest
1 голос
/ 09 июля 2020

Я создаю приложение счетчика и хочу иметь возможность изменять заголовок панели приложений, принимая ввод от пользователя с помощью всплывающего поля ввода. ) в AlertDialog с текстовым полем в нем и пытается получить строку на главной странице, определяя функцию для всплывающего окна, которое возвращает введенную строку при подтверждении кнопка нажата. Я назначаю переменную этой функции, используя await в onPressed () на главной странице, а затем отображаю изменение строковой переменной в снэк-баре . однако закусочная появляется, как только я нажимаю на текстовое поле, даже не отправляя и не нажимая кнопку подтверждения. похоже, что либо ожидание не работает, либо по какой-то причине родительская функция Alertdialog возвращает значение null, как только я нажимаю на текстовое поле.

import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(


     home: CounterApp(),
    ));

class CounterApp extends StatefulWidget {

  @override
  _CounterAppState createState() => _CounterAppState();
}

class _CounterAppState extends State<CounterApp> {


  int num = 0;
  String name = 'MyCounter-1';



 Future<String> changeName() async {

    final _controller = TextEditingController();

    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(15)
          ),
          title: Text('Change counter name'),
          content: TextField(
            controller: _controller,
            onSubmitted: (str) {
              //Navigator.of(context).pop(str);
            },
          ),
          actions: <Widget>[
            FlatButton(
              onPressed: () {
                Navigator.of(context).pop(_controller.text.toString());
              },
              child: Text(
                'Confirm',
                style: TextStyle(
                  fontSize: 18.0,
                ),
              ),
            ),
            FlatButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text(
                'Cancel',
                style: TextStyle(
                  fontSize: 18.0,
                ),
              ),
            ),
          ],
        );
      },
    );
  }

  void snackBar(BuildContext context, String string) {
    final snackbar = SnackBar(content: Text('Counter renamed to $string'),);
    Scaffold.of(context).showSnackBar(snackbar);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(name),
        centerTitle: true,
        actions: <Widget>[
          IconButton(
            onPressed: () {
              setState(() {
                num = 0;
              });
            },
            icon: Icon(
              Icons.refresh,
              size: 35.0,
            ),
          ),
          Builder(
            builder: (context) => IconButton(
              onPressed: () async {
                setState(() async {
                  name = await changeName();
                  snackBar(context, name);
                });
              },
              icon: Icon(
                Icons.edit,
                size: 35.0,
              ),
            ),
          ),
        ],
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Expanded(
            flex: 2,
            child: Container(
              child: Center(child: Text(
                '$num',
                style: TextStyle(
                  fontSize: 75,
                ),
              )),
            ),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
            child: RaisedButton(
              onPressed: () {
                setState(() {
                  num += 1;
                });
              },

              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(25.0)
              ),
              color: Colors.blue,
              child: Text(
                '+',
                style: TextStyle(
                  fontSize: 100.0,
                ),
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(20, 0, 20, 20),
            child: RaisedButton(
              onPressed: () {
                setState(() {
                  num -= 1;
                });
              },
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(25.0)
              ),
              color: Colors.grey,
              child: Text(
                '-',
                style: TextStyle(
                  fontSize: 100.0,
                ),
              ),
            ),
          )
        ],
      ),
    );
  }
}

Как только я нажимаю кнопку редактирования, происходит следующее: Изображение проблемы

1 Ответ

0 голосов
/ 09 июля 2020

Просто добавьте await ключевое слово перед showDialog() и, наконец, добавьте оператор возврата, как показано в приведенном ниже коде.

Future<String> changeName() async {
    final _controller = TextEditingController();

    await showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
          title: Text('Change counter name'),
          content: TextField(
            controller: _controller,
            onSubmitted: (str) {
              //Navigator.of(context).pop(str);
            },
          ),
          actions: <Widget>[
            FlatButton(
              onPressed: () {
                Navigator.of(context).pop(_controller.text.toString());
              },
              child: Text(
                'Confirm',
                style: TextStyle(
                  fontSize: 18.0,
                ),
              ),
            ),
            FlatButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text(
                'Cancel',
                style: TextStyle(
                  fontSize: 18.0,
                ),
              ),
            ),
          ],
        );
      },
    );

    return _controller.text;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...