dart 如何在flutter中切换多个窗口小部件?

epfja78i  于 2022-12-15  发布在  Flutter
关注(0)|答案(3)|浏览(186)

我有一行包含4 outlinedbutton,我有4个小部件(列表视图,ListWheelScrollView,图像png和svg图像)我想显示一个小部件只有当我按下一个outlinedbutton。我应该用什么在flutter中做这件事?提供一些代码将是有益的

Container(
             padding: EdgeInsets.all(8.0),
             height: 100,
             child: Row(
               children: [
                 Expanded(
                   child: OutlinedButton(
           onPressed: () =>
              //show widget1
       
                 )),
            Expanded(
                   child: OutlinedButton(
           onPressed: () =>
              //show widget2
       
                 )),
 Expanded(
                   child: OutlinedButton(
           onPressed: () =>
              //show widget3
       
                 )),
 Expanded(
                   child: OutlinedButton(
           onPressed: () =>
              //show widget4
       
                 )),
               ],
             ),
           )
8oomwypt

8oomwypt1#

创建枚举

enum WidgetEnum { LISTVIEW, LIST_WHEEL_SCROLLVIEW, IMAGE, SVG_IMAGE }

用于更新值的全局变量。

//set the default value.
var isEnumValue = WidgetEnum.LISTVIEW;

小部件

//place this method or place those widget in build method
Widget getVisibleWidget() {
return Container(
  padding: EdgeInsets.all(8.0),
  child: Column(
    children: [
      Row(
        children: [
          //1
          Expanded(
            child: OutlinedButton(
              onPressed: () {
                setEnumValue(WidgetEnum.LISTVIEW);
              },
              child: Text("Button LISTVIEW"),
            ),
          ),
          //2
          Expanded(
            child: OutlinedButton(
              onPressed: () {
                setEnumValue(WidgetEnum.LIST_WHEEL_SCROLLVIEW);
              },
              child: Text("Button LIST_WHEEL_SCROLLVIEW"),
            ),
          ),
          //3
          Expanded(
            child: OutlinedButton(
              onPressed: () {
                setEnumValue(WidgetEnum.IMAGE);
              },
              child: Text("Button IMAGE"),
            ),
          ),
          //4
          Expanded(
            child: OutlinedButton(
              onPressed: () {
                setEnumValue(WidgetEnum.SVG_IMAGE);
              },
              child: Text("Button SVG_IMAGE"),
            ),
          ),
        ],
      ),

      //1
      Visibility(
        visible: isEnumValue == WidgetEnum.LISTVIEW,
        child: Text("LISTVIEW"),
      ),
      //2
      Visibility(
        visible: isEnumValue == WidgetEnum.LIST_WHEEL_SCROLLVIEW,
        child: Text("LIST_WHEEL_SCROLLVIEW"),
      ),
      //3
      Visibility(
        visible: isEnumValue == WidgetEnum.IMAGE,
        child: Text("IMAGE"),
      ),
      //4
      Visibility(
        visible: isEnumValue == WidgetEnum.SVG_IMAGE,
        child: Text("SVG_IMAGE"),
      ),
    ],
  ),
);

}
设置枚举值以更新Widget可见性。

void setEnumValue(var enumValue){
    isEnumValue = enumValue;
    setState(() {

    });
}
flseospp

flseospp2#

你可以用不同的方法来做。一个简单的方法是为每个小部件创建4个布尔变量。在按下按钮时,特定小部件的值为真,其他3个值为假。在另一边,使用if(istiswidget)来显示小部件,如果值为真。一些代码演示

bool widget1, widget2, widget3, widget4 = false;

压缩小部件1

onPressed: (){
widget1 = true;
widget2, widget3, widget4 = false;}

打开小部件2

onPressed: (){
   setState(() {
     widget2 = true;
     widget1, widget3, widget4 = false;
   });
   }

对其他函数执行相同操作
在每个小部件之前设置UI条件

if(widget1)
Container(), //display widget1
if(widget2)
Container() //display widget2
if(widget3)
Container(), //display widget3
if(widget4)
Container() //display widget4

注意:使用setstate、provider或任何其他状态管理方法更新实时值和UI

cwxwcias

cwxwcias3#

创建这个变量来标识要显示的小部件,它将获得从0到3的值

int widgetNum = 0;

并在每个按钮的onPressed中添加此,不要忘记添加正确的num

onPressed: () =>setState(() {
      //for example 
      widgetNum = 2; //for first btn will be = 0 etc..
    });

并使用可见性来显示小部件

Column(
   children:[
     Visibility(
       visible: widgetNum==2, // for first widget will be ==0 etc..
       child: Container(
      // your widget 
     ))]
)

相关问题