Flutter: выберите значок в AlertDialog и покажите новый значок

Я пытаюсь использовать AlertDialog во флаттере, где пользователь может нажать карту, чтобы выбрать значок. После того, как они выбрали значок, AlertDialog должен отобразить только что выбранный значок.

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

Все советы и / или различные идеи о том, как справиться с подобными проблемами, приветствуются.

Вот код, который у меня ниже:

import 'package:flutter/material.dart';
import 'package:test_003/data/dataStoreLegendItems.dart'; //has defaultIcon which should get updated
import 'package:test_003/dialogs/iconPickerDialog.dart';

class IconPickerCard extends StatefulWidget {
  var alertDialogContext;
  IconPickerCard({this.alertDialogContext});
  @override
  _IconPickerCardState createState() => _IconPickerCardState();
}

class _IconPickerCardState extends State<IconPickerCard> {
  @override

  Widget build(BuildContext context) {
    return new Card(
      child: ListTile(
        leading: legendItems.defaultIcon,
        title: Text('Select Icon'),
        onTap: () async {
          setState(() {
            print("First line of IconPickerCard set state");
            showIconPickerDialog(widget.alertDialogContext);
            print('Icon Picker Card List Tile pressed');
          });
        },
      ),
    );
  }
}

Это вызывается диалоговым окном предупреждений:

import 'package:flutter/material.dart';
import 'package:test_003/components/iconPickerForPopup.dart';

class ReuseAddPopup extends StatefulWidget {
  @override
  _ReuseAddPopupState createState() => _ReuseAddPopupState();
}

class _ReuseAddPopupState extends State<ReuseAddPopup> {
  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      content: Column(
        children: [
          IconPickerCard(alertDialogContext: context),
        ],
      ),
    );
  }
}

Вот как это выглядит: Диалоговое окно предупреждения Затем при нажатии карты: IconPicker После выбора значка изменения не отражаются на карте, пока карта не будет нажата. снова: После выбора значка


person Meerkat Panda    schedule 10.12.2020    source источник


Ответы (1)


В наложенных виджетах, таких как modalBottomSheet и showDialog, контекст отличается, поэтому состояние не восстанавливается, чтобы выполнить восстановление, мы должны обернуть его StatefulBuilder виджетом следующим образом: -

  @override

  Widget build(BuildContext context) {
    return StatefulBuilder(
          builder: (BuildContext context, StateSetter dialogState /*You can rename this!*/) {
    return  Card(
      child: ListTile(
        leading: legendItems.defaultIcon,
        title: Text('Select Icon'),
        onTap: () async {
          dialogState(() {
            print("First line of IconPickerCard set state");
            showIconPickerDialog(widget.alertDialogContext);
            print('Icon Picker Card List Tile pressed');
          });
        },
      ),
    );
  }
        
      });

рекомендовал бы использовать это в вызове AlertDialog и сделать все без состояния.

person sameer kashyap    schedule 10.12.2020
comment
Это помогло - спасибо! - person Meerkat Panda; 23.12.2020
comment
не могли бы вы принять ответ, если он правильный @MeerkatPanda - person sameer kashyap; 23.12.2020