首页 > 解决方案 > 有没有办法将一个有状态小部件的数据更新状态推送到另一个有状态小部件?

问题描述

我一直在努力解决将更新数据从一个小部件推送到另一个小部件的问题。当我有两个有状态小部件并且数据在父有状态小部件中更新但未在子有状态小部件中更新时,会出现此问题。使用 freezed 包会发生错误,但如果没有它也会发生错误。

到目前为止,我还没有找到任何可以解决此问题的方法。

下面是一个例子:

第一个有状态的小部件:

class FirstWidget extends StatefulWidget {
  @override
  _FirstWidgetState createState() => _FirstWidgetState();
}

class _FirstWidgetState extends State<FirstWidget> {

  ItemBloc _itemBloc = getit<ItemBloc>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
          backgroundColor: Colors.black,
          appBar: AppBar(
            elevation: Mquery.width(context, 2.5),
            backgroundColor: Colors.black
            title: Text(
              'First stateful widget',
              style: TextStyle(fontSize: 17),
            ),
            centerTitle: true,
          ),
      body: BlocBuilder<ItemsBloc,ItemsState>(
             cubit: _itemsBloc,
             builder: (BuildContext context,ItemState state) {
                     return state.when(
                               initial: () => Container(),
                               loading: () => Center(child: CustomLoader()),
                               success: (_items) {
                                     return AnotherStatefulWidget(
                                             items: _items,
                                             ...
                                     );
                                  },
                               );
                           },
                        ));
                      },
                  );
);
  }
}

第二个有状态的小部件:

class AnotherStatefulWidget extends StatefulWidget {
  final List<String> items;

  AnotherStatefulWidget(this.items);

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

class _AnotherStatefulWidgetState extends State<AnotherStatefulWidget> {
  final ScrollController scrollController = ScrollController();
  ItemsBloc _itemsBloc = getit<ItemsBloc>();

  bool _handleNotification(ScrollNotification notification, List<String> items) {
    if (notification is ScrollEndNotification &&
        scrollController.position.extentAfter == 0.00) {
      _itemsBloc.add(ItemsLoadEvent.loadMoreItems(
          categories: items, document: ...));
    }

    return false;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Container(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Container(
                width: double.infinity,
                height: 280,
                child: Padding(
                  padding: EdgeInsets.only(
                    right: 8,
                  ),
                  child: NotificationListener<ScrollNotification>(
                    onNotification: (_n) =>
                        _handleNotification(_n, widget.items),
                    child: DraggableScrollbar.arrows(
                      alwaysVisibleScrollThumb: true,
                      controller: scrollController,
                      child: ListView.builder(
                        controller: scrollController,
                        itemCount: widget.items.length,
                        itemBuilder: (context, index) {
                          return GestureDetector(
                            child: Padding(
                              padding: EdgeInsets.all(16),
                              child: Align(
                                  alignment: Alignment.center,
                                  child: Text(
                                    widget.items[index],
                                    style: TextStyle(color: Colors.white),
                                  )),
                            ),
                          );
                        },
                      ),
                    ),
                  ),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

我真的很感激任何帮助!

谢谢你的时间,

标签: flutterdartstatestate-managementstatefulwidget

解决方案


推荐阅读