Flutter 设置状态不';t仅在热重新加载页面时才更改该值
我有以下情况Flutter 设置状态不';t仅在热重新加载页面时才更改该值,flutter,Flutter,我有以下情况 Column( children: [ Tabs(), getPage(), ], ), getPage方法 Widget getPage() { if (tab1IsSelected == true) { return Container( child: Center( child: Text('Tab1'), ), ); }
Column(
children: [
Tabs(),
getPage(),
],
),
getPage方法
Widget getPage() {
if (tab1IsSelected == true) {
return Container(
child: Center(
child: Text('Tab1'),
),
);
}
if (tab1IsSelected == false) {
return Container(
child: Center(
child: Text('Tab2'),
),
);
}
}
我已经声明了一个变量
bool tab1IsSelected = true;
在Tabs类中(statefull):
类选项卡扩展StatefulWidget{
@凌驾
_TabsState createState()=>TabsState();
}
类_TabsState扩展状态{
@凌驾
小部件构建(构建上下文){
返回行(
儿童:[
扩大(
儿童:手势检测器(
onTap:(){
设置状态(){
表1已选择=真;
});
},
子:容器(
装饰:盒子装饰(
颜色:已选择Tab1?主:第二,
),
孩子:填充(
衬垫:
仅限边缘集(顶部:1.5*SizeConfig.高度倍增器),
儿童:中心(
子:文本(
“新狩猎”,
样式:Theme.of(context).textTheme.bodyText1,
),
),
),
),
),
),
扩大(
儿童:手势检测器(
onTap:(){
设置状态(){
表1选中=假;
});
},
子:容器(
装饰:盒子装饰(
颜色:已选择选项卡1?第二个:主,
),
孩子:填充(
衬垫:
仅限边缘集(顶部:1.5*SizeConfig.高度倍增器),
儿童:中心(
子:文本(
“我的狩猎”,
样式:Theme.of(context).textTheme.bodyText2,
),
),
),
),
),
),
],
);
}
}
我更改了bool的值,但只有当我热重新加载内容正在更改的页面时。为什么?
你能指引我吗
我试着用过在该列中,但结果相同,如果我在该列所在的主类中声明该变量,我无法在Tabs类中访问它,所以这就是我全局声明它的原因,也许这就是我必须热重载的原因,但是我如何实现它来做我想做的事情呢。提前谢谢设置状态在
\u选项卡状态中
,因此它只会影响/重建特定的小部件,而不是getPage()
,您可以尝试使用ValueChanged
检索新值,然后在包装getPage()的小部件中使用设置状态
每次更改
tab1sselected
的值时,它都会更新getPage()
如果要在小部件状态发生变化时重建小部件,则需要调用小部件的setState()。
变量被引用到State类,当您调用setState()时,flatter将通过调用State类的build()方法来重建小部件本身
如果您希望在小部件之外有一些变量,我建议您使用下面列出的状态管理方法:
例如,您可以使用Provider来存储活动选项卡并在两个小部件中引用Provider变量。您可以尝试在持有选项卡小部件的父类中处理setstate,然后将函数传递给tab类并在手势检测器中执行。您正在
选项卡中调用setstate
widget,所以这是将刷新的widget,而不是父widget或任何其他不是其直接后代的widget。热重新加载触发整个小部件树的刷新。
class Tabs extends StatefulWidget {
@override
_TabsState createState() => _TabsState();
}
class _TabsState extends State<Tabs> {
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
child: GestureDetector(
onTap: () {
setState(() {
tab1IsSelected = true;
});
},
child: Container(
decoration: BoxDecoration(
color: tab1IsSelected ? primary : second,
),
child: Padding(
padding:
EdgeInsets.only(top: 1.5 * SizeConfig.heightMultiplier),
child: Center(
child: Text(
'New Hunt',
style: Theme.of(context).textTheme.bodyText1,
),
),
),
),
),
),
Expanded(
child: GestureDetector(
onTap: () {
setState(() {
tab1IsSelected = false;
});
},
child: Container(
decoration: BoxDecoration(
color: tab1IsSelected ? second : primary,
),
child: Padding(
padding:
EdgeInsets.only(top: 1.5 * SizeConfig.heightMultiplier),
child: Center(
child: Text(
'My Hunts',
style: Theme.of(context).textTheme.bodyText2,
),
),
),
),
),
),
],
);
}
}
class Tabs extends StatefulWidget {
final ValueChanged<bool> onChanged;
Tabs({this.onChanged});
@override
_TabsState createState() => _TabsState();
}
class _TabsState extends State<Tabs> {
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
child: GestureDetector(
onTap: () => widget.onChanged(true), //pass the value to the onChanged
child: Container(
decoration: BoxDecoration(
color: tab1IsSelected ? primary : second,
),
child: Padding(
padding:
EdgeInsets.only(top: 1.5 * SizeConfig.heightMultiplier),
child: Center(
child: Text(
'New Hunt',
style: Theme.of(context).textTheme.bodyText1,
),
),
),
),
),
),
Expanded(
child: GestureDetector(
onTap: () => widget.onChanged(false), //pass the value to the onChanged
child: Container(
decoration: BoxDecoration(
color: tab1IsSelected ? second : primary,
),
child: Padding(
padding:
EdgeInsets.only(top: 1.5 * SizeConfig.heightMultiplier),
child: Center(
child: Text(
'My Hunts',
style: Theme.of(context).textTheme.bodyText2,
),
),
),
),
),
),
],
);
}
}
Column(
children: [
Tabs(
onChanged: (bool value) => setState(() => tab1IsSelected = value);
),
getPage(),
],
),