Flutter ChipSelect回调未更新UI。颤振
我放弃了寻找setState()未运行构建方法的原因。我有一个选择芯片,它有一个回调函数。调试告诉我,我实际上在回调时收到了所选芯片,但setState()没有更新ui。我花了一整天的时间试图理解为什么setState()没有运行build()方法。这是我的密码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
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);
},
),