Flutter 中如何显示条件 Widget

》》》前期回顾 》》》

1. Dart 内置类型之 Record,不同于元组! 推荐指数: ⭐️⭐️⭐️⭐️⭐️

Flutter 中如何显示条件 Widget

1. 场景:

Flutter 日常开发中经常会遇见这样的需求,如: 只有用户是 VIP 时,才能展示某个入口或者某个模块。这样的需求在开发业务需求中多如牛毛,那你是如何来优雅的实现的呢?

2. 推荐实现方式

下面是本人在开发中常用的集中实现方式,博友们可以根据自己的业务需求可以参考。

1. if 形式

这是一种非常常见的形式,满足条件就实现 Widget。示例如下:

dart 复制代码
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    const Text(
      'You have pushed the button this many times:',
    ),
    Text(
      '$_counter',
      style: Theme.of(context).textTheme.headlineMedium,
    ),
    if (_counter > 2)
      Container(
        width: 100,
        height: 100,
        color: Colors.red,
      )
  ],
),

注意: 在 if 后面不能使用大括号 ({})。 错误指示如下:

2. if-else 形式

这也是一种常见的形式,满足条件显示 Widget1 ;不满足条件显示 Widget2 。示例如下:

dart 复制代码
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    const Text(
      'You have pushed the button this many times:',
    ),
    Text(
      '$_counter',
      style: Theme.of(context).textTheme.headlineMedium,
    ),
    if (_counter > 2)
      Container(
        width: 100,
        height: 100,
        color: Colors.red,
      )
    else
      Container(
        width: 100,
        height: 100,
        color: Colors.green,
      )
  ],
)

注意: 在 if-else 后面不能使用大括号 ({}) ; if 下的组件件的后面不能使用逗号(,)。 错误写法示例:

3. if...[widget1,widget2] 形式

该种形式也是常用于业务开发,它是当条件成立时,显示多个 Widget。 示例如下:

dart 复制代码
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    const Text(
      'You have pushed the button this many times:',
    ),
    Text(
      '$_counter',
      style: Theme.of(context).textTheme.headlineMedium,
    ),
    if (_counter > 2) ...[
      Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
      Container(
        width: 100,
        height: 100,
        color: Colors.green,
      )
    ],
  ],
)
4. if...[widget1,widget2] else...[widget3,widget4] 形式

该种形式也是常用于业务开发,它是当条件成立时,显示多个 Widget;条件不成立时,显示多个 Widget。 示例如下:

dart 复制代码
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    const Text(
      'You have pushed the button this many times:',
    ),
    Text(
      '$_counter',
      style: Theme.of(context).textTheme.headlineMedium,
    ),
    if (_counter > 2) ...[
      Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
      Container(
        width: 100,
        height: 100,
        color: Colors.green,
      )
    ] else ...[
      Container(
        width: 100,
        height: 100,
        color: Colors.pinkAccent,
      ),
      Container(
        width: 100,
        height: 100,
        color: Colors.yellow,
      ),
    ]
  ],
)

注意: if 下的组件集合的后面不能使用逗号(,)。 错误写法示例:

5. 函数形式

这种形式是将这一块的逻辑抽离到另一个地方。该方法有个不足之处,那就是在不满足条件时也要返回一个 Widget。 示例如下:

dart 复制代码
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    const Text(
      'You have pushed the button this many times:',
    ),
    Text(
      '$_counter',
      style: Theme.of(context).textTheme.headlineMedium,
    ),
    getWidget1(),
  ],
)

// 函数形式
  Widget getWidget1() {
    if (_counter > 2) {
      return Container(
        width: 100,
        height: 100,
        color: Colors.green,
      );
    } else {
      return Container(
        width: 100,
        height: 100,
        color: Colors.pinkAccent,
      );
    }
  }
}

3. 总结

以上就是 Flutter 如何显示条件 Widget 的方式。其实还有其他的方法,例如 switch 。这些其他的方法我们在后续文章中介绍。

相关推荐
恋猫de小郭44 分钟前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker6 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴6 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭16 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab17 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
明君8799721 小时前
Flutter 如何给图片添加多行文字水印
前端·flutter
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
ssshooter1 天前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
四眼肥鱼1 天前
flutter 利用flutter_libserialport 实现SQ800 串口通信
前端·flutter
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos