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(),
  ], 
),