【问题标题】:ChipSelect callback is not updating the UI. FlutterChipSelect 回调未更新 UI。扑
【发布时间】:2020-05-23 12:19:19
【问题描述】:

我放弃了寻找 setState() 没有运行构建方法的原因。我有一个具有回调函数的 ChoiceChip。调试显示我实际上在回调中收到了选定的芯片,但 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】:

    我终于找到了解决方案。 我只是替换了

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

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

    我的 viewModel 扩展了更改通知器并构建了一个孩子作为消费者,所以我完全理解它为什么起作用。但是我仍然不明白为什么以前的版本不起作用。只有当你向我解释问题时,我才会再次感到高兴,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2020-04-10
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      相关资源
      最近更新 更多