ChipSelect回调没有更新UI。翩翩

问题描述 投票:0回答:1

我放弃了寻找setState()不运行构建方法的原因。我有一个ChoiceChip,它有一个回调函数。Debug显示我在回调时确实收到了所选芯片,但setState()没有更新ui。我花了一整天的时间试图理解为什么setState()没有运行build()方法。以下是我的代码

   class SocialStoryCategory extends StatefulWidget {
      final Function(String) onMenuItemPress;
      SocialStoryCategory({Key key, @required this.onMenuItemPress}) : sup er(key: key);

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

    class _SocialStoryCategoryState extends State<SocialStoryCategory> {
      int _value = 0;
      List<String> categoryList;
      @override
      Widget build(BuildContext context) {
        categoryList = [
          NoomeeLocalizations.of(context).trans('All'),
          NoomeeLocalizations.of(context).trans('Communication'),
          NoomeeLocalizations.of(context).trans('Behavioral'),
          NoomeeLocalizations.of(context).trans('ADL'),
          NoomeeLocalizations.of(context).trans('Other')
        ];

        return Wrap(
            spacing: 4,
            children: List<Widget>.generate(5, (int index) {
              return Theme(
                data: ThemeData.from(
                    colorScheme: ColorScheme.light(primary: Colors.white)),
                child: Container(
                  child: ChoiceChip(
                    elevation: 3,
                    selectedColor: Colors.lightBlueAccent,
                    label: Text(categoryList.elementAt(index)),
                    selected: _value == index,
                    onSelected: (bool selected) {
                      setState(() {
                        _value = selected ? index : null;

                        if (categoryList.elementAt(_value) == "All") {
                          widget.onMenuItemPress("");
                        } else {
                          widget.onMenuItemPress(categoryList.elementAt(_value));
                        }
                      });
                    },
                  ),
                ),
              );
            }).toList());
      }
    }

这里是我得到回调的地方。

 class SocialStoriesHome extends StatefulWidget {
      @override
      _SocialStoriesHomeState createState() => _SocialStoriesHomeState();
    }

    class _SocialStoriesHomeState extends State<SocialStoriesHome>
        with TickerProviderStateMixin {
      String title;
      TabController _tabController;
      int _activeTabIndex = 0;
      String _defaultStoryCategory;

      _goToDetailsPage() {
        Navigator.of(context).pushNamed("parent/storyDetails");
      }


      @override
      void dispose() {
        _tabController.dispose();
        super.dispose();
      }

      @override
      void initState() {
        super.initState();
        _tabController = TabController(vsync: this, length: 2);
        _defaultStoryCategory = '';
      }

      @override
      Widget build(BuildContext context) {
        return BaseWidget<SocialStoryViewModel>(
          model: new SocialStoryViewModel(
            socialStoriesService: Provider.of(context),
          ),
          onModelReady: (model) =>
              model.fetchDefaultStoriesByCategory(_defaultStoryCategory),
          builder: (context, model, child) => DefaultTabController(
            length: 2,
            child: Scaffold(


              body: model.busy
                  ? Center(child: CircularProgressIndicator())
                  : Container(
                            child: Column(
                              children: <Widget>[
                                new SocialStoryCategory(
                                  onMenuItemPress: (selection) {
                                   setState(() {
                                      _defaultStoryCategory = selection;

                                    });
                                  },
                                ),

                                Expanded(
                                  child: ListView(
                                    children: getStories(model.socialStories),
                                  ),
                                ),
                              ],
                            ),
          ),
        );
      }
    }

    List<Widget> getStories(List<SocialStoryModel> storyList) {
      List<Widget> list = List<Widget>();
      for (int i = 0; i < storyList.length; i++) {
        list.add(Padding(
          padding: const EdgeInsets.all(8.0),
          child: Template(
              title: storyList[i].name,
              subTitle: storyList[i].categories,
              hadEditIcon: false),
        ));
      }
      return list;
    }
flutter dart setstate state-management
1个回答
0
投票

最后,我终于找到了解决办法。

new SocialStoryCategory(onMenuItemPress: (selection) {
                                   setState(() {
                                      _defaultStoryCategory = selection;

                                    });
                                  },
                                ),

 new SocialStoryCategory(
                              onMenuItemPress: (selection) {
                                 model.fetchDefaultStoriesByCategory(selection);
                              },
                            ),

我的viewModel扩展了变化通知器,并建立了一个孩子作为消费者,所以我完全理解为什么它的工作。但我还是不明白为什么以前的版本不能用。只有当你给我解释这个问题的时候,我才会重新感到高兴。

© www.soinside.com 2019 - 2024. All rights reserved.