Flutter flatter希望在其子视图上调用父视图以刷新主视图

Flutter flatter希望在其子视图上调用父视图以刷新主视图,flutter,dart,Flutter,Dart,我有一个有状态小部件,它有一个子按钮和一组有状态容器(可见和不可见)。 我想在这里尝试的是,当我调用特定按钮时,特定按钮将刷新所有布局,并在其特定视图上通过设置可见来更改它,而其他按钮则不可见 像这样: button1 = view1; button2 = view2; button3 = view3; if (button1 is pressed){ view1 is visible} else{ not visible} 在我的代码中,在我第一次查看(登录按钮)时,我已设置为使用我的主

我有一个有状态小部件,它有一个子按钮和一组有状态容器(可见和不可见)。 我想在这里尝试的是,当我调用特定按钮时,特定按钮将刷新所有布局,并在其特定视图上通过设置可见来更改它,而其他按钮则不可见

像这样:

button1 = view1;
button2 = view2;
button3 = view3;

if (button1 is pressed){
view1 is visible}
 else{
not visible}
在我的代码中,在我第一次查看(登录按钮)时,我已设置为使用我的主页,如下所示:

child: MaterialButton(
        minWidth: MediaQuery.of(context).size.width,
        padding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => MainPage(change1: true,change2: false,change3: false,)),
          );
        },

now i was display my main_page view (with a child view  that has visibility property).
这是我在主页上的代码:

class MainPage extends StatefulWidget {

  final bool change1 ;
  final bool change2;
  final bool change3 ;

  const MainPage({Key key, this.change1,this.change2,this.change3}) : super(key: key);

  @override
  _MainPageState createState() => _MainPageState();

}

class _MainPageState extends State<MainPage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: <Widget>[
            Container(
              constraints: BoxConstraints.expand(
                height: 280.0,
              ),
              decoration: BoxDecoration(
                image: new DecorationImage(
                  fit: BoxFit.cover,
                  colorFilter: new ColorFilter.mode(
                      Colors.blueAccent, BlendMode.colorBurn),
                  image: new ExactAssetImage("images/vector.jpg"),
                ),
              ),
              child: Stack(
                children: <Widget>[

                  Container(
                    alignment: Alignment.bottomCenter,
                    child: Row(
                      children: <Widget>[
                        Expanded(
                          child: GestureDetector(
                            onTap: () {
                              setState(() {
                                print("i pressed Official Business");

                                 MainPage(change1: true,change2: false,change3: false);
                                  //TODO: here is my problem, when i call the main_page on its page,
                                //        the value of change1, change2, and chaange3 is not updating
                                 //       so that icanot update my view .

                              });
                            },
                            child: Container(
                              height: 50.0,
                              child: Padding(
                                padding: const EdgeInsets.all(10.0),
                                child: Center(
                                  child: Text(
                                    "Official Business",
                                    style: TextStyle(
                                        fontSize: 20.0, color: Colors.white),
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ),
                        Expanded(
                          child: GestureDetector(
                            onTap: () {
                              setState(() {
                                print("i pressed file an OB");
                                 MainPage(change1: false,change2: true,change3: false);

                                //TODO: here is my problem, when i call the main_page on its page,
                                //        the value of change1, change2, and chaange3 is not updating
                                 //       so that icanot update my view .

                              });
                            },
                            child: Container(
                              height: 50.0,
                              child: Padding(
                                padding: const EdgeInsets.all(10.0),
                                child: Center(
                                  child: Text(
                                    "File an OB",
                                    style: TextStyle(
                                        fontSize: 20.0, color: Colors.white),
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),

                ],
              ),
            ),
            //TODO:
            new Visibility(
              //Called changed and viewOne
              visible: widget.change1,
              child: OfficialBusiness(),
            ),
            new Visibility(
              //Called not changed and viewTwo
              visible: widget.change2,
              child: FilingOb(),
            ),
            new Visibility(
              //Called not changed and viewTwo
              visible: widget.change3,
              child: ViewOfficialBusiness(),
            )


     ],
    ),
  ),
);
class主页扩展StatefulWidget{
最终布尔变换1;
最终布尔变换2;
最终布尔变换3;
常量主页({Key-Key,this.change1,this.change2,this.change3}):超级(Key:Key);
@凌驾
_MainPageState createState()=>\u MainPageState();
}
类_MainPageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
子:列(
儿童:[
容器(
约束:BoxConstraints.expand(
身高:280.0,
),
装饰:盒子装饰(
图片:新装饰图片(
适合:BoxFit.cover,
colorFilter:新的colorFilter.mode(
Colors.blueAccent、BlendMode.colorBurn),
图片:新的ExactAssetImage(“images/vector.jpg”),
),
),
子:堆栈(
儿童:[
容器(
对齐:对齐.bottomCenter,
孩子:排(
儿童:[
扩大(
儿童:手势检测器(
onTap:(){
设置状态(){
打印(“我按公务”);
主页(change1:true,change2:false,change3:false);
//TODO:这是我的问题,当我调用主页时,
//change1、change2和chaange3的值未更新
//所以我不能更新我的观点。
});
},
子:容器(
身高:50.0,
孩子:填充(
填充:常数边集全部(10.0),
儿童:中心(
子:文本(
“公务”,
样式:TextStyle(
字体大小:20.0,颜色:彩色。白色),
),
),
),
),
),
),
扩大(
儿童:手势检测器(
onTap:(){
设置状态(){
打印(“我按了一个OB文件”);
主页(change1:false,change2:true,change3:false);
//TODO:这是我的问题,当我调用主页时,
//change1、change2和chaange3的值未更新
//所以我不能更新我的观点。
});
},
子:容器(
身高:50.0,
孩子:填充(
填充:常数边集全部(10.0),
儿童:中心(
子:文本(
“提交OB”,
样式:TextStyle(
字体大小:20.0,颜色:彩色。白色),
),
),
),
),
),
),
],
),
),
],
),
),
//待办事项:
新可见性(
//调用changed和viewOne
可见:widget.change1,
child:OfficialBusiness(),
),
新可见性(
//调用NotChanged和viewTwo
可见:widget.change2,
child:FilingOb(),
),
新可见性(
//调用NotChanged和viewTwo
可见:widget.change3,
子项:ViewOfficialBusiness(),
)
],
),
),
);
} }

fillingob/officialbusiness/ViewOfficialBusiness includded是一组有状态布局,我没有添加代码来防止视图过多


很抱歉,在这个编程语言的新版本中,我想告诉大家我遇到的这些问题,我的代码是否可行。另外,如果您需要更多的参考,请点击评论,这样我就可以在flatter中提供我的其他代码了,当父窗口小部件的一个子部件中发生某些事情时,调用父窗口小部件上的函数的标准方法是将一个函数从父窗口小部件传递给子窗口小部件,以便从子窗口小部件触发该函数,并使用只有父窗口小部件知道的数据

在您的案例中,在您的第一个视图中,您可以定义如下的新方法:

child: MaterialButton(
        minWidth: MediaQuery.of(context).size.width,
        padding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => MainPage(change1: true,change2: false,change3: false,)),
          );
        },

now i was display my main_page view (with a child view  that has visibility property).
void onChildPressed(){
设置状态(){
//在这里,您可以更改布尔值change1,change2,任意更改
});
}
然后,在子视图中,您必须定义一个函数参数,以便您的子视图可以接收函数
enum MyView {
  officialBusiness,
  filingOb,
  viewOfficialBusiness,
}
MyView current;

// GestureDetector(onTap: () => setState(() { current = MyView.officialBusiness; }))

// Visibility(
//   visible: current == MyView.officialBusiness,
//   child: OfficialBusiness(),
// )