首页 > 解决方案 > 颤振嵌套步进器小部件未更新

问题描述

我有一个嵌套的小部件,即使状态改变也不会更新。我试图覆盖 didWidgetUpdate 但我没有得到任何触发。

但是,如果我循环执行这些步骤,按 NEXT/PREV 切换到不同的步骤并返回之前的同一步骤将显示更新的小部件。

class ManageWidget extends StatefulWidget {
  Item_item;

  ManageWidget({Key key}) : super(key: key);

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

class _ManageWidgetState extends StateMVC<ManageWidget> {

  @override
  void didUpdateWidget(ManageWidget oldWidget) {
    print('Updated');
    super.didUpdateWidget(oldWidget);
    if (widget._item != oldWidget._item) {
      print('Not same!');
      // NONE OF THIS PRINTS
    }
    super.didUpdateWidget(oldWidget);
  }

  Future removeImage(String photoId) async {
    bool res = await deletePhoto(photoId);
    print(widget._item.photos.length.toString());
    if (res){
      widget._item.photos.removeWhere((element) => element.id == photoId);
      setState(() {
      });
      print(widget._item.photos.length.toString());
      print('Removed');
    } else {
      print('Failed');
    }
  }

  void showFullScreenDialog({BuildContext context, dynamic item, String title}) {
    setState(() { widget._item = item; });
    List<Step> steps = [
Step(
          title: Text('PHOTOS'),
          isActive: true,
          state: StepState.editing,
          content:
          Form(
            key: key,
            child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20),
            child: EditCarouselWidget(photos: widget._item.photos,
                    addPhoto: selectPhoto,
                    deletePhoto: removePhoto,
                    context: context)
        ),
          ),
        ),

Step(
          title: Text('DUMMY'),
          isActive: true,
          state: StepState.editing,
          content:
          Form(
            key: key,
            child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20),
            child: Text('DUMMY'),
          ),
        )
];
    List<GlobalKey<FormState>> keys = [];
    steps.forEach((element) {
      GlobalKey<FormState> _key = new GlobalKey<FormState>();
      keys.add(_key);
    });

    showGeneralDialog(
      context: context,
      barrierColor: Colors.white.withOpacity(1),
      barrierDismissible: false,
      barrierLabel: "Dialog",
      transitionDuration: Duration(milliseconds: 400),
      pageBuilder: (_, __, ___) {
        return GenericDialog(item: item, onChanged: (){ onChanged(); }, steps: steps, keys: keys, title: title);
      },
    );

    print('Show');
  }

...
Widget.build:
                    MaterialButton(
                      onPressed: () {
                        showFullScreenDialog(context: context,
                          item: new Item(),
                          title: 'Add Item',
                        );
                      },
                      child: Text('Begin'),
                    ),

}

在 GenericDialog 中,我根据我通过的步骤构建步进器

class GenericDialog extends StatefulWidget {
  dynamic item;
  VoidCallback onChanged;
  List<GlobalKey<FormState>> keys;
  dynamic steps;
  String title;

  GenericDialog({Key key, this.item, this.onChanged, this.steps, this.keys, this.title}) : super(key: key);

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

class _GenericDialogState extends State<GenericDialog> {

...
Widget.build:
Stepper(
                        type: StepperType.horizontal,
                        steps: widget.steps,
                        currentStep: currentStep,
                        controlsBuilder: (BuildContext context, {VoidCallback onStepContinue, VoidCallback onStepCancel}) {
                          return SizedBox.shrink();
                        },
                      ),
}

感谢任何指导。

谢谢!

标签: flutter

解决方案


推荐阅读