新状态覆盖之前的状态

时间:2021-06-22 21:16:48

标签: flutter dart bloc

所以我创建了一个 List<Map<String, dynamic>> 状态,但是当我尝试添加一个新元素时,它覆盖了所有元素。例如,一开始我在地址值为1的地方添加了一个新元素,第二次在地址值为9的地方添加了一个新元素,但是所有的元素都被新元素覆盖了(list的所有元素,地址值变为9)。大家有没有和我一样的问题?我坚持了好几天

在我添加新元素之前:

添加新元素后:

这是我如何添加新元素的代码,state.values 来自 BlocListener,它在状态改变时监听并携带值

...
List<Map<String, dynamic>> _records = [];

Widget build(BuildContext context) {
    final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        centerTitle: true,
        backgroundColor: ColorConst.appBarColor,
        title: Text(
          widget.field!.label!,
          style: TextStyle(color: Colors.white),
        ),
      ),
      body: SafeArea(
        child: BlocListener<ViewPageBloc, ViewPageState>(
            bloc: _formViewBloc,
            listener: (context, state) {
              if (state.isProcessing) {

                if (isSaveAndNew) {
                  _records.add(state.values);

                  _formViewBloc.add(ViewPageLoadFormModel(
                      modelName: (widget.field as RelationalField)
                          .relation!
                          .modelName));
                  isSaveAndNew = false;
                }
              }
            }
        .
        .
        .
        )
      )
    )
}

1 个答案:

答案 0 :(得分:0)

final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

不要在构建方法中声明。您的构建方法被触发两次。 改用 ScaffoldMessenger()。

final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        centerTitle: true,
        backgroundColor: ColorConst.appBarColor,
        title: Text(
          widget.field!.label!,
          style: TextStyle(color: Colors.white),
        ),
      ),
      body: SafeArea(
        child: BlocListener<ViewPageBloc, ViewPageState>(
            bloc: _formViewBloc,
            listener: (context, state) {
              if (state.isProcessing) {

                if (isSaveAndNew) {
                  _records.add(state.values);

                  _formViewBloc.add(ViewPageLoadFormModel(
                      modelName: (widget.field as RelationalField)
                          .relation!
                          .modelName));
                  isSaveAndNew = false;
                }
              }
            }
        .
        .
        .
        )
      )
    )
}