如何在一个小部件中调用setState以便与其他部件一起更改该小部件?

时间:2019-11-11 03:15:19

标签: flutter

我有2个小部件,然后将第一个小部件放入变量中。当我单击第一个窗口小部件中的按钮时,我将调用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
            ),
          )
        ],
      ),

我将第一个小部件CheckInTemplate放入变量中,在CheckInTemplate中,我有一个按钮:

RaisedButton(
            padding: EdgeInsets.symmetric(vertical: 15.0, horizontal: 60),
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(30.0)
            ),
            color: Colors.white,
            onPressed: (){
              setState(() {
                checkinWidget = CaptureCameraTemplate();
              });
            },
            child: Text('Check in',
              style: TextStyle(
                  fontSize: 25,
                fontFamily: 'FredokaOne'
              ),),
          ),

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

2 个答案:

答案 0 :(得分:0)

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

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;
     }
   }

答案 1 :(得分:0)

您可能已经添加了这一行,

Widget checkinWidget = CheckInTemplate(); 

采用build方法。

build方法中删除它,并将其放到build的一边,然后它将起作用。