Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter ChipSelect回调未更新UI。颤振_Flutter_Dart_Setstate_State Management - Fatal编程技术网

Flutter ChipSelect回调未更新UI。颤振

Flutter ChipSelect回调未更新UI。颤振,flutter,dart,setstate,state-management,Flutter,Dart,Setstate,State Management,我放弃了寻找setState()未运行构建方法的原因。我有一个选择芯片,它有一个回调函数。调试告诉我,我实际上在回调时收到了所选芯片,但setState()没有更新ui。我花了一整天的时间试图理解为什么setState()没有运行build()方法。这是我的密码 class SocialStoryCategory extends StatefulWidget { final Function(String) onMenuItemPress; SocialStoryC

我放弃了寻找setState()未运行构建方法的原因。我有一个选择芯片,它有一个回调函数。调试告诉我,我实际上在回调时收到了所选芯片,但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 SocialStoryCategory扩展了StatefulWidget{
最后一个函数(字符串)onMenuItemPress;
SocialStoryCategory({Key-Key,@required this.onMenuItemPress}):super(Key:Key);
@凌驾
_SocialStoryCategoryState createState()=>\u SocialStoryCategoryState();
}
类_SocialStoryCategoryState扩展状态{
int _值=0;
列表分类列表;
@凌驾
小部件构建(构建上下文){
类别列表=[
NoomeeLocalizations.of(context).trans('All'),
NoomeeLocalizations.of(context.trans)(“通信”),
NoomeeLocalizations.of(context.trans)(“行为”),
NoomeeLocalizations.of(context.trans('ADL'),
NoomeeLocalizations.of(context.trans('Other'))
];
回程包装(
间距:4,
子项:List.generate(5,(int索引){
返回主题(
数据:ThemeData.from(
colorScheme:colorScheme.light(原色:颜色.白色)),
子:容器(
孩子:选择权(
标高:3,
selectedColor:Colors.lightBlueAccent,
标签:文本(categoryList.elementAt(index)),
所选:_值==索引,
onSelected:(布尔选定){
设置状态(){
_值=所选?索引:空;
if(categoryList.elementAt(_值)=“全部”){
widget.onMenuItemPress(“”);
}否则{
onMenuItemPress(categoryList.elementAt(_值));
}
});
},
),
),
);
}).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;
    }
class SocialstorieHome扩展StatefulWidget{
@凌驾
_SocialstorieShareState createState()=>U SocialstorieShareState();
}
类_SocialstorieHomeState扩展状态
使用TickerProviderStateMixin{
字符串标题;
TabController\u TabController;
int_activeTabIndex=0;
字符串defaultStoryCategory;
_goToDetailsPage(){
Navigator.of(context.pushNamed(“父/故事细节”);
}
@凌驾
无效处置(){
_tabController.dispose();
super.dispose();
}
@凌驾
void initState(){
super.initState();
_tabController=tabController(vsync:this,长度:2);
_defaultStoryCategory='';
}
@凌驾
小部件构建(构建上下文){
返回BaseWidget(
型号:新SocialStoryViewModel(
SocialToriesService:上下文的提供者,
),
onModelReady:(model)=>
model.fetchDefaultStoriesByCategory(_defaultStoryCategory),
生成器:(上下文、模型、子项)=>DefaultTabController(
长度:2,
孩子:脚手架(
正文:model.busy
?中心(子项:循环压缩机指示器())
:容器(
子:列(
儿童:[
新社会责任分类(
onMenuItemPress:(选择){
设置状态(){
_defaultStoryCategory=选择;
});
},
),
扩大(
子:ListView(
孩子们:getStories(模范社团),
),
),
],
),
),
);
}
}
列表获取故事(列表故事列表){
List=List();
for(int i=0;i
我终于找到了解决方案。 我只是换了

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

                                    });
                                  },
                                ),

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

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