Flutter:省略三元运算符中的 else 子句以使用默认样式

Posted

技术标签:

【中文标题】Flutter:省略三元运算符中的 else 子句以使用默认样式【英文标题】:Flutter: Omit else clause in ternary operator in order to use default styling 【发布时间】:2021-09-26 07:54:23 【问题描述】:

我经常遇到一些情况,我想根据一些可能如下所示的条件设置Widget 的样式:

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: Home()));

class Home extends StatefulWidget 
  @override
  _HomeState createState() => _HomeState();


class _HomeState extends State<Home> 
  bool condition = true;
  
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Center(
        child: OutlinedButton(
            style: OutlinedButton.styleFrom(
                side:
                    BorderSide(color: condition ? Colors.blue : /** DEFAULT Color**/)),
            onPressed: () => _changeColor(),
            child: Text('Press')),
      ),
    );
  

  void _changeColor() => setState(() => condition = !condition);

上述代码无法编译,因为如果 condition 为 false,Flutter 希望我指定替代颜色。但我不想指定任何颜色,而只是使用我的Theme 设置的默认颜色,以防 条件 评估为false。这怎么可能?

我知道在要返回Widget 的情况下使用三元运算符时(例如在child: condition ? Container() : ... 之后),我们可以简单地指定SizedBox.shrink() 以使其无效。当不想指定任何样式但回退到默认行为时,我会分别做什么?

【问题讨论】:

【参考方案1】:

如果 Flutter 小部件的构造函数的属性不是必需的,通常可以安全地给它null(因为这是任何省略的可选属性的默认值),此时小部件要么忽略它属性或回退到隐式默认值,以适当者为准。

所以在这种情况下,color 的“默认”值可以简单地为空,此时BorderSide 的constructor 将回退到默认值Color(0xFF000000)

BorderSide(color: condition ? Colors.blue : null)

【讨论】:

我之前尝试过使用null,但这会产生以下运行时错误Exception has occurred. _AssertionError ('package:flutter/src/painting/borders.dart': Failed assertion: line 69 pos 15: 'color != null': is not true.),考虑到BorderSide 构造函数... : assert(color != null) 的源代码,这很有意义。如果我切换到空安全,我的 IDE 甚至会显示 语法错误。任何想法如何达到预期的结果?谢谢! 在这种情况下,您可以只使用省略参数时会使用的默认值 - const Color(0xFF000000) 嗯,这正是问题所在,我不知道确切的默认颜色是什么。它不是 100% 黑色,而是根据我使用的 Theme(浅色或深色)而变化的一些较浅的值。是否有任何表格可以用来查找 Flutter widgets 的默认颜色,以了解它们所指的 Theme 的哪个属性(例如 primaryColoraccentColor)? 我链接的源代码清楚地表明,省略时该属性的默认颜色是 100% 黑色。您可以通过点击链接或在 IDE 中右键单击 BorderSide 并选择“查看实现”或类似内容自行查看。 Dart/Flutter 是开源的,你可以随时打开一个小部件来查看它是如何实现的。 好的,我明白了。我希望有一种方法可以避免指定任何内容,因为我指定了自定义 OutlinedButtonTheme(对于我的浅色和深色 Theme),我希望应用程序在出现 false 条件时回退到它。不过谢谢你的帮助!【参考方案2】:

在主文件中,在MaterialApp中,我们通常会放主题细节,如果我们愿意也可以放自定义样式。如果我们不放置自定义主题数据,那么我们的应用将使用默认样式。

要获得主题价值,我们需要上下文。我们可以使用它来获取任何主题值。

var primaryColor = Theme.of(context).primaryColor;

Theme.of(context) 有每个主题样式的值,你可以从这里获取默认值。

喜欢

BorderSide(color: condition ? Colors.blue : Theme.of(context).primaryColor)

【讨论】:

以上是关于Flutter:省略三元运算符中的 else 子句以使用默认样式的主要内容,如果未能解决你的问题,请参考以下文章

没有 `else` 的 Julia 三元运算符

没有 else 子句的单行 If 条件 [重复]

如何使用 JavaScript 中的三元运算符更改函数中的 if else 语句?

java java.java中的三元if else运算符

java java.java中的三元if else运算符

java java.java中的三元if else运算符