Flutter 如何在没有MaterialPage路由的情况下传递参数函数setState?

Flutter 如何在没有MaterialPage路由的情况下传递参数函数setState?,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我有更新状态的问题。我需要将一个带有setState的函数传递到一个小部件中,但我不知道该怎么做。问题是我需要传递一个静态函数,在那里我不能执行setState。我需要哪些选项来修复它 我的代码 类导航栏扩展StatefulWidget{ @凌驾 状态createState(){ 返回_NavigationBarState(); } } 类_NavigationBarState扩展状态{ bool showMusicTab=假; bool openMusicTab=false; int指数=4

我有更新状态的问题。我需要将一个带有
setState
的函数传递到一个小部件中,但我不知道该怎么做。问题是我需要传递一个静态函数,在那里我不能执行
setState
。我需要哪些选项来修复它

我的代码

类导航栏扩展StatefulWidget{
@凌驾
状态createState(){
返回_NavigationBarState();
}
}
类_NavigationBarState扩展状态{
bool showMusicTab=假;
bool openMusicTab=false;
int指数=4;
最终列表屏幕=[
Home(),
搜索(),
AddPost(),
通知(),
个人资料(表演音乐和乐队演奏)
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:Colors.black,
正文:屏幕[索引],
persistentFooterButtons:showMusicTab
? [
容器(
颜色:颜色,黑色,
身高:20,
宽度:MediaQuery.of(context).size.width,
孩子:ListTile(
前导:图标(Icons.favorite_边框,颜色:Colors.white),
标题:中心(
孩子:InkWell(
onTap:(){},
子:文本(
“伤了我的灵魂”,
样式:TextStyle(
颜色:颜色,白色,
fontFamily:kRobotoBold,
fontWeight:fontWeight.bold),
),
),
),
尾随:图标(
图标。暂停\u圆圈\u填充,
颜色:颜色,白色,
),
),
)
]
:null,
底部导航栏:底部导航栏(
当前索引:索引,
onTap:(int索引){
设置状态(){
这个指数=指数;
});
},
类型:BottomNavigationBarType.fixed,
showSelectedLabels:false,
显示未选择的标签:false,
背景颜色:Colors.black,
项目:[
新海底导航气压计(
图标:新图标(
我的家,
颜色:索引==0?颜色。pinkAccent:Colors.white,
),
标题:新文本(“主页”),
),
新海底导航气压计(
图标:新图标(
Icons.search,
颜色:索引==1?颜色。pinkAccent:Colors.white,
),
标题:新文本(“搜索”),
),
新海底导航气压计(
图标:新图标(
Icons.add_圈,
颜色:索引==2?颜色。pinkAccent:Colors.white,
),
标题:新文本(“添加帖子”),
),
新海底导航气压计(
图标:新图标(
图标、通知、,
颜色:索引==3?颜色。pinkAccent:Colors.white,
),
标题:新文本(“通知”),
),
新海底导航气压计(
图标:图标(
一个人,
颜色:索引==4?颜色。pinkAccent:Colors.white,
),
标题:文本(“概要文件”)
],
),
);
}
静态虚空显示音乐伴奏(){
设置状态(){
showMusicTab=true;
});
}

}
您的问题是,当小部件第一次创建时,您试图通过直接在字段声明处为其分配对象的
列表来填充
屏幕

class\u NavigationBarState扩展状态{
最终列表屏幕=[
Home(),
搜索(),
AddPost(),
通知(),
个人资料(表演音乐和乐队演奏)
];
...
}
像这样填充对象时,只能使用静态字段和方法填充它。这是ShowMusicTabPlay的一个问题,因为它调用
setState
,这是一个实例方法,不能从静态方法调用

相反,您应该在构造函数或
initState
方法中填充
屏幕
(建议使用后者):

class\u NavigationBarState扩展状态{
列出屏幕;
@凌驾
void initState(){
super.initState();
屏幕=[
Home(),
搜索(),
AddPost(),
通知(),
个人资料(表演音乐和乐队演奏)
];
}
...
}

有了这个,你现在可以将
showMusicTabAndPlay
作为一个实例方法而不是静态方法,错误就会消失。

setState不能在静态函数中使用,为什么你首先要在静态函数中使用它???@AhmedKhattab我知道这是我想问的,我想问的,如何将带有
setState
的函数传递给小部件,因为当我在没有
static
的情况下传递函数时,我抱怨只传递静态函数,您正在创建小部件列表作为字段声明的一部分,此时您只能使用静态值,因为实例值还不存在。您应该在
initState
期间填充
屏幕。(不幸的是,这意味着您将无法完成
最终版
[尚未])@Abion47填充
屏幕
是什么意思?