У меня проблема с флаттером, я создал всплывающее диалоговое окно, когда пользователь нажимает определенную кнопку, и он может устанавливать флажки внутри него.

Проблема в том, что флажки не обновляются в setState (), сразу после того, как я закрываю всплывающее диалоговое окно и открываю его снова, я вижу, что проверяю их.

Это не хорошо, что у меня есть setState () во всплывающем диалоговом окне? Кажется, я не понимаю, в чем проблема.

Это код:

Изменить: обновленный код:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

class AlwaysDisabledFocusNode extends FocusNode {
  @override
  bool get hasFocus => false;
}

class MultiLanguagePopupProduct extends StatefulWidget {
  @override
  _MultiLanguagePopupProductState createState() =>
      _MultiLanguagePopupProductState();
}

class _MultiLanguagePopupProductState extends State<MultiLanguagePopupProduct> {
  int selectedIndex = -1;

  String text = '';

  @override
  Widget build(BuildContext context) {
    return StatefulBuilder(
        builder: (context, setState) {
          return Container(
            child: TextField(
              focusNode: AlwaysDisabledFocusNode(),
              enableInteractiveSelection: false,
              decoration: InputDecoration(
                suffixIcon: IconButton(
                  icon: Icon(FontAwesomeIcons.boxOpen),
                ),
                labelText: 'Name and language: $text ',
                labelStyle:
                TextStyle(
                    fontWeight: FontWeight.bold, color: Colors.lightGreen),
              ),
              onTap: () =>
                  showDialog(
                    context: context,
                    builder: (context) {
                      return AlertDialog(
                        scrollable: true,
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                        title: Text('Multilanguage for product'),
                        content: Column(
                          children: <Widget>[
                            DataTable(
                              onSelectAll: (val) {
                                setState(() {
                                  selectedIndex = -1;
                                  text = '';
                                });
                              },
                              columns: [
                                DataColumn(label: Text('Language')),
                                DataColumn(label: Text('Translation')),
                              ],
                              rows: [
                                DataRow(
                                    selected: 0 == selectedIndex,
                                    onSelectChanged: (val) {
                                      setState(() {
                                        selectedIndex = 0;
                                        text = 'RO';
                                      }
                                      );
                                    },
                                    cells: [
                                      DataCell(
                                          Text(
                                            "RO",
                                            textAlign: TextAlign.left,
                                            style: TextStyle(
                                                fontWeight: FontWeight.bold),
                                          ), onTap: () {
                                        setState(() {
                                          selectedIndex = 0;
                                          text = 'RO';
                                          print('RO is clicked');
                                        });
                                      }),
                                      DataCell(
                                        TextField(
                                          decoration: InputDecoration(
                                              border: InputBorder.none,
                                              hintText: 'paine'),
                                        ),
                                      ),
                                    ]),
                                DataRow(
                                    selected: 1 == selectedIndex,
                                    onSelectChanged: (val) {
                                      setState(() {
                                        selectedIndex = 1;
                                        text = 'EN';
                                      });
                                    },
                                    cells: [
                                      DataCell(
                                          Text(
                                            "EN",
                                            textAlign: TextAlign.left,
                                            style: TextStyle(
                                                fontWeight: FontWeight.bold),
                                          ), onTap: () {
                                        setState(() {
                                          selectedIndex = 1;
                                          text = 'EN';
                                          print('EN is clicked');
                                        });
                                      }),
                                      DataCell(
                                        TextField(
                                          decoration: InputDecoration(
                                              border: InputBorder.none,
                                              hintText: 'bread'),
                                        ),
                                      ),
                                    ]),
                                DataRow(
                                    selected: 2 == selectedIndex,
                                    onSelectChanged: (val) {
                                      setState(() {
                                        selectedIndex = 2;
                                        text = 'FR';
                                      });
                                    },
                                    cells: [
                                      DataCell(
                                          Text(
                                            "FR",
                                            textAlign: TextAlign.left,
                                            style: TextStyle(
                                                fontWeight: FontWeight.bold),
                                          ), onTap: () {
                                        setState(() {
                                          selectedIndex = 2;
                                          text = 'FR';
                                          print('FR is clicked');
                                        });
                                      }),
                                      DataCell(
                                        TextField(
                                          decoration: InputDecoration(
                                              border: InputBorder.none,
                                              hintText: 'pain'),
                                        ),
                                      ),
                                    ]),
                              ],
                            ),
                          ],
                        ),
                        actions: <Widget>[
                          FlatButton(
                              onPressed: () => Navigator.of(context).pop(),
                              child: Text('OK')),
                          FlatButton(
                              onPressed: () => Navigator.of(context).pop(),
                              child: Text('CANCEL')),
                        ],
                      );
                    },
                  ),
            ),
          );
        },
    );
  }
}
1
Alexandru Buruiana 17 Сен 2020 в 11:46

2 ответа

Лучший ответ

StatefulBuilder - правильный ответ. Однако вы кладете его не туда. Вы должны поместить его внутри showDialog (), а не снаружи. Я реализовал ваш код в codepen. Проверить это.

showDialog(
  context: context,
  builder: (context) {
    return StatefulBuilder(
      builder: (context, setStateForDialog) {
        return AlertDialog();
      }
    );
  }
)
1
Dung Ngo 4 Ноя 2020 в 02:51

Чтобы обновить виджеты только внутри него, используйте StatefulBuilder, чтобы использовать setState внутри диалогового окна.

 showDialog(
  context: context,
   builder: (context) {
   String contentText = "Content of Dialog";
    return StatefulBuilder(
     builder: (context, setState) {
      return AlertDialog(
      title: Text("Title Text"),
      content: Text(contentText),
      actions: <Widget>[
        FlatButton(
          onPressed: () => Navigator.pop(context),
          child: Text("Cancel"),
        ),
        FlatButton(
          onPressed: () {
            setState(() {
              contentText = "Changed Content of your Dialog";
            });
          },
          child: Text("Change Text"),
         ),
        ],
      );
    },
   );
  },
);
1
Subaharan Vel 17 Сен 2020 в 09:46