Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在一个小部件中调用setState来用另一个小部件更改该小部件?_Flutter - Fatal编程技术网

Flutter 如何在一个小部件中调用setState来用另一个小部件更改该小部件?

Flutter 如何在一个小部件中调用setState来用另一个小部件更改该小部件?,flutter,Flutter,我有两个小部件,我把第一个放在一个变量中。当我在第一个小部件中单击一个按钮时,我将调用setState并将第二个小部件放入要重建的变量。然而,它没有起作用 我尝试在它们的父窗口小部件中调用setState,它就可以工作了。有人知道它有什么问题,以及如何解决这个问题吗 这是我的代码: Widget checkinWidget = CheckInTemplate(); Column( children: <Widget>[ Expanded(

我有两个小部件,我把第一个放在一个变量中。当我在第一个小部件中单击一个按钮时,我将调用setState并将第二个小部件放入要重建的变量。然而,它没有起作用

我尝试在它们的父窗口小部件中调用setState,它就可以工作了。有人知道它有什么问题,以及如何解决这个问题吗

这是我的代码:

Widget checkinWidget = CheckInTemplate();
Column(
        children: <Widget>[
          Expanded(
            flex: 3,
            child: Container(),
          ),
          Expanded(
            flex: 1,
            child: AnimatedSwitcher(
              duration: const Duration(seconds: 1),
                child: checkinWidget
            ),
          )
        ],
      ),

当我点击按钮时,什么也没有发生。

我为此开发了一个示例,请检查下面的代码

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WidgetHandling(),
    );
  }
}

class WidgetHandling extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _WidgetHandling();
  }
}

class _WidgetHandling extends State<WidgetHandling> {

  Widget widgetHolder;

  void initState() {
    widgetHolder = firstWidget();
    super.initState();
  }

   Widget firstWidget() {
     return Container(
       color: Colors.white,
       child: Center(
         child: FlatButton(
           color: Colors.blue,
           textColor: Colors.white,
           padding: EdgeInsets.all(8.0),
           splashColor: Colors.blueAccent,
           onPressed: () {
             setState(() {
               widgetHolder = secondWidget();
             });
           },
           child: Text(
             "First Widget",
             style: TextStyle(fontSize: 20.0),
           ),
         ),
       ),
     );
   }

      Widget secondWidget() {
        return Container(
          color: Colors.grey,
          child: Center(
            child: FlatButton(
              color: Colors.blue,
              textColor: Colors.white,
              padding: EdgeInsets.all(8.0),
              splashColor: Colors.blueAccent,
              onPressed: () {
               setState(() {
                 widgetHolder = firstWidget();
               });
              },
              child: Text(
                "Second Widget",
                style: TextStyle(fontSize: 20.0),
              ),
            ),
          ),
        );
      }

     @override
     Widget build(BuildContext context) {
       return widgetHolder;
     }
   }
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:WidgetHandling(),
);
}
}
类WidgetHandling扩展了StatefulWidget{
@凌驾
状态createState(){
返回_WidgetHandling();
}
}
类_WidgetHandling扩展状态{
widgetHolder;
void initState(){
widgetHolder=firstWidget();
super.initState();
}
Widget firstWidget(){
返回容器(
颜色:颜色,白色,
儿童:中心(
孩子:扁平按钮(
颜色:颜色,蓝色,
textColor:Colors.white,
填充:边缘设置。全部(8.0),
splashColor:Colors.blueAccent,
已按下:(){
设置状态(){
widgetHolder=secondWidget();
});
},
子:文本(
“第一个小部件”,
样式:TextStyle(fontSize:20.0),
),
),
),
);
}
Widget secondWidget(){
返回容器(
颜色:颜色。灰色,
儿童:中心(
孩子:扁平按钮(
颜色:颜色,蓝色,
textColor:Colors.white,
填充:边缘设置。全部(8.0),
splashColor:Colors.blueAccent,
已按下:(){
设置状态(){
widgetHolder=firstWidget();
});
},
子:文本(
“第二个小部件”,
样式:TextStyle(fontSize:20.0),
),
),
),
);
}
@凌驾
小部件构建(构建上下文){
返回寡妇持有人;
}
}

您可能已经添加了这一行

Widget checkinWidget = CheckInTemplate(); 
build
方法中


将它从
build
方法中删除,放到build的外侧,然后它就会工作。

请分享一些代码。@Mahdi Malv对不起,我的错,我添加了它。你让我意识到我将2个小部件放在2类中,当我调用setState时,它只重建第一个小部件的类,而不是父小部件。谢谢你,现在可以工作了。对不起,这是我的错误,我把第一个和第二个小部件放到了2个类中,所以当我调用setState时,它将重建该类,但不会重建它们的父小部件。谢谢你帮助我。
Widget checkinWidget = CheckInTemplate();