AlertDialog устанавливает в Function / OnTap - PullRequest
0 голосов
/ 01 марта 2019

плохо знакомый с трепетом.Я знаю, как установить состояние диалогового окна предупреждения, но с необходимостью нажатия, чтобы функционировать как () => _createPlayer, он не хочет перестраивать диалоговое окно предупреждения.Интересно, как установить состояние в диалоговом окне предупреждений, когда вам нужно нажать на них.

 File _image;

    GestureDetector(
                onTap: () => _createPlayer(),

После нажатия отобразится диалоговое окно с предупреждением, например:

_createPlayer() {
    return showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(32.0))),
            content: Container(
              height: 400,
              width: 300,
              child: Column(
                children: <Widget>[
                  Text('Create Player', style: Theme
                      .of(context)
                      .textTheme
                      .body1),
                  GestureDetector(
                    onTap: _getImageCamera,
                    child: CircleAvatar(
                      radius: 100,
                      backgroundColor: Colors.white,
                      backgroundImage: _image != null ? FileImage(_image) : AssetImage('assets/images/undercover.png'),
                    ),
                  ),
                ],
              ),
            ),
          );
        });
  }

_getImageCamera() async{
    var image = await ImagePicker.pickImage(source: ImageSource.camera);

    setState(() {
      _image = image;
    });
  }

Я хочу установитьсостояние / изменить изображение в диалоговом окне предупреждения при выборе.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Чтобы увидеть изменения пользовательского интерфейса на showDialog, вам нужно создать новый StatefulWidget и затем работать с диалогом в этом классе. Вот пример / пример кода

0 голосов
/ 28 июля 2019

Вы можете использовать StatefulBuilder для изменения внутри диалога

showDialog(
  context: context,
  builder: (context) {
    String contentText = "Content of Dialog";

    // add StatefulBuilder to return value

    return StatefulBuilder(
      builder: (context, setState) {
        return AlertDialog(
          title: Text("Title of Dialog"),
          content: Text(contentText),
          actions: <Widget>[
            FlatButton(
              onPressed: () => Navigator.pop(context),
              child: Text("Cancel"),
            ),
            FlatButton(
              onPressed: () {
                setState(() {
                  contentText = "Changed Content of Dialog";
                });
              },
              child: Text("Change"),
            ),
          ],
        );
      },
    );
  },
);
0 голосов
/ 01 марта 2019

Создайте отдельный пользовательский виджет Stateful Widget для AlertDialog и переместите в него переменную _getImageCamera function _image следующим образом:

_createPlayer() {
    return CustomDialog();
}
class CustomDialog extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return CustomDialogState();
  }

}

class CustomDialogState extends State<CustomDialog> {
ImageProvider _image;
@override
  void initState() {
    super.initState();
}
@override
  Widget build(BuildContext context) {
    return AlertDialog(
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(32.0))),
            content: Container(
              height: 400,
              width: 300,
              child: Column(
                children: <Widget>[
                  Text('Create Player', style: Theme
                      .of(context)
                      .textTheme
                      .body1),
                  GestureDetector(
                    onTap: _getImageCamera,
                    child: CircleAvatar(
                      radius: 100,
                      backgroundColor: Colors.white,
                      backgroundImage: _image != null ? FileImage(_image) : AssetImage('assets/images/undercover.png'),
                    ),
                  ),
                ],
              ),
            ),
          );
        });

}

_getImageCamera() async{
    var image = await ImagePicker.pickImage(source: ImageSource.camera);

    setState(() {
      _image = image;
    });
  }
}
...