Flutter 颤振将主题数据背景设置为LinearGradient

Flutter 颤振将主题数据背景设置为LinearGradient,flutter,colors,themes,Flutter,Colors,Themes,有没有办法将主题数据类的背景色设置为线性渐变?我的应用程序将在不同的主题之间变化,我希望每个主题都有不同的渐变。我尝试将LinearGradient设置为backgroundColor,但给了我一个参数类型“LinearGradient”无法分配给参数类型“Color”。错误 这就是我试过的 final _darkTheme = ThemeData( primarySwatch: Colors.grey, primaryColor: Colors.black, brigh

有没有办法将
主题数据
类的
背景色
设置为线性渐变?我的应用程序将在不同的主题之间变化,我希望每个主题都有不同的渐变。我尝试将LinearGradient设置为backgroundColor,但给了我一个
参数类型“LinearGradient”无法分配给参数类型“Color”。
错误

这就是我试过的

final _darkTheme = ThemeData(
    primarySwatch: Colors.grey,
    primaryColor: Colors.black,
    brightness: Brightness.dark,
//    backgroundColor: const Color(0xFF212121),
    backgroundColor: const LinearGradient(colors: [Colors.blue, Colors.green]),
    accentColor: Colors.white,
    floatingActionButtonTheme:
        FloatingActionButtonThemeData(foregroundColor: Colors.black),
    dividerColor: Colors.black12,
);

有什么建议吗?我不想手动设置每个容器,也不想有一个额外的constants类以某种方式与每个主题关联。

这可能不是最好和有效的方法,但却是一个非常简单的解决方案。我在我的主题类中创建了两个变量
mythimes
。根据选定的主题,
gradientColorA
gradientColorB
这两个变量将相应地改变。我只是通过构造函数调用这些变量-
TriviaThemes.gradientColorA

这是我的主题课:

class MyThemes {
    static Color gradientColorA = Color(0xFFFFFFFF);
    static Color gradientColorB = Color(0xFF000000);

    ThemeData getTheme(String themeName) {
      if (themeName == 'darkTheme') {
        gradientColorA = Color(0xFFFFFFFF);
        gradientColorB = Color(0xFF000000);
        return _darkTheme;
      } else if (themeName == 'lightTheme') {
        gradientColorA = Color(0xFF000000);
        gradientColorB = Color(0xFFFFFFFF);
        return _lightTheme;
      } else {
      return _lightTheme;
    }
  }

  final _darkTheme = ThemeData(
    primarySwatch: Colors.grey,
    primaryColor: Colors.black,
    brightness: Brightness.dark,
    accentColor: Colors.white,
    floatingActionButtonTheme:
        FloatingActionButtonThemeData(foregroundColor: Colors.black),
    dividerColor: Colors.black12,
  );

  final _lightTheme = ThemeData(
    accentColor: Colors.black,
    backgroundColor: const Color(0xFFE5E5E5),
    brightness: Brightness.light,
    buttonColor: Colors.blue,
    dividerColor: Colors.white54,
    disabledColor: Colors.grey,
    floatingActionButtonTheme:
        FloatingActionButtonThemeData(foregroundColor: Colors.white),
    fontFamily: 'Simplifica',
    primarySwatch: Colors.grey,
    primaryColor: Colors.white,
  );
}
这是渐变代码的外观:

gradient: LinearGradient(
  begin: Alignment.topCenter,
  end: Alignment.bottomCenter,
  colors: [
    TriviaThemes.gradientColorA,
    TriviaThemes.gradientColorB,
  ],
),

这可能不是最好和有效的方法,但却是一个非常简单的解决方案。我在我的主题类中创建了两个变量
mythimes
。根据选定的主题,
gradientColorA
gradientColorB
这两个变量将相应地改变。我只是通过构造函数调用这些变量-
TriviaThemes.gradientColorA

这是我的主题课:

class MyThemes {
    static Color gradientColorA = Color(0xFFFFFFFF);
    static Color gradientColorB = Color(0xFF000000);

    ThemeData getTheme(String themeName) {
      if (themeName == 'darkTheme') {
        gradientColorA = Color(0xFFFFFFFF);
        gradientColorB = Color(0xFF000000);
        return _darkTheme;
      } else if (themeName == 'lightTheme') {
        gradientColorA = Color(0xFF000000);
        gradientColorB = Color(0xFFFFFFFF);
        return _lightTheme;
      } else {
      return _lightTheme;
    }
  }

  final _darkTheme = ThemeData(
    primarySwatch: Colors.grey,
    primaryColor: Colors.black,
    brightness: Brightness.dark,
    accentColor: Colors.white,
    floatingActionButtonTheme:
        FloatingActionButtonThemeData(foregroundColor: Colors.black),
    dividerColor: Colors.black12,
  );

  final _lightTheme = ThemeData(
    accentColor: Colors.black,
    backgroundColor: const Color(0xFFE5E5E5),
    brightness: Brightness.light,
    buttonColor: Colors.blue,
    dividerColor: Colors.white54,
    disabledColor: Colors.grey,
    floatingActionButtonTheme:
        FloatingActionButtonThemeData(foregroundColor: Colors.white),
    fontFamily: 'Simplifica',
    primarySwatch: Colors.grey,
    primaryColor: Colors.white,
  );
}
这是渐变代码的外观:

gradient: LinearGradient(
  begin: Alignment.topCenter,
  end: Alignment.bottomCenter,
  colors: [
    TriviaThemes.gradientColorA,
    TriviaThemes.gradientColorB,
  ],
),

我可以通过在自定义主题类的colorScheme中定义主颜色和次颜色来实现这一点

class AppTheme {
  AppTheme._();

  static final ThemeData lightTheme = ThemeData(
    brightness: Brightness.light,
    primarySwatch: Colors.green,
    accentColor: Colors.purple[300],
    scaffoldBackgroundColor: Colors.grey[100],
    colorScheme: ColorScheme.light(
      primary: Colors.green,
      secondary: Colors.green[100],
    ),
  );

  static final ThemeData darkTheme = ThemeData(
    brightness: Brightness.dark,
    primarySwatch: Colors.green,
    accentColor: Colors.purple[300],
    colorScheme: ColorScheme.dark(
      primary: Colors.green[800],
      secondary: Colors.green[600],
    ),
  );
}
在“自定义按钮”小部件中,我将主要设置为渐变开始颜色,次要设置为渐变结束颜色,如下所示:

child:RaisedButton(
标高:8.0,
形状:RoundedRectangleBorder(borderRadius:borderRadius.circular(80.0)),
填充:所有边缘设置(0.0),
孩子:墨水(
装饰:盒子装饰(
梯度:线性梯度(
颜色:[
Theme.of(context).colorScheme.primary,
Theme.of(context).colorScheme.secondary,
],
开始:Alignment.centerLeft,
结束:对齐。中间右侧,
),
边界半径:边界半径。圆形(30.0)),
子:容器(
约束:框约束(最小高度:50.0),
对齐:对齐.center,
子:文本(
标题
textAlign:textAlign.center,
样式:TextStyle(颜色:Colors.white),
),
),
),
按下:(){},
),
最后,我得到的是:


我可以通过在自定义主题类的colorScheme中定义原色和副色来实现这一点

class AppTheme {
  AppTheme._();

  static final ThemeData lightTheme = ThemeData(
    brightness: Brightness.light,
    primarySwatch: Colors.green,
    accentColor: Colors.purple[300],
    scaffoldBackgroundColor: Colors.grey[100],
    colorScheme: ColorScheme.light(
      primary: Colors.green,
      secondary: Colors.green[100],
    ),
  );

  static final ThemeData darkTheme = ThemeData(
    brightness: Brightness.dark,
    primarySwatch: Colors.green,
    accentColor: Colors.purple[300],
    colorScheme: ColorScheme.dark(
      primary: Colors.green[800],
      secondary: Colors.green[600],
    ),
  );
}
在“自定义按钮”小部件中,我将主要设置为渐变开始颜色,次要设置为渐变结束颜色,如下所示:

child:RaisedButton(
标高:8.0,
形状:RoundedRectangleBorder(borderRadius:borderRadius.circular(80.0)),
填充:所有边缘设置(0.0),
孩子:墨水(
装饰:盒子装饰(
梯度:线性梯度(
颜色:[
Theme.of(context).colorScheme.primary,
Theme.of(context).colorScheme.secondary,
],
开始:Alignment.centerLeft,
结束:对齐。中间右侧,
),
边界半径:边界半径。圆形(30.0)),
子:容器(
约束:框约束(最小高度:50.0),
对齐:对齐.center,
子:文本(
标题
textAlign:textAlign.center,
样式:TextStyle(颜色:Colors.white),
),
),
),
按下:(){},
),
最后,我得到的是:


我认为你最好还是接受常量类。有什么特别的原因不想使用它吗?我宁愿只使用已经存在的类的属性,而不是做额外的工作。现在我需要弄清楚如何根据选定的主题选择常量。另外,额外的代码可能会增加出现错误的可能性。@BadrB是否有扩展主题数据的方法?如果我可以为2种颜色的主题数据添加其他属性,那么我可以使用这些颜色,比如:渐变:LinearGradient(颜色:[Theme.of(context).color1,Theme.of(context.color2])。无论主题何时改变,这些值都会相应地改变。我认为最好的选择是只接受常量类。有什么特别的原因不想使用它吗?我宁愿只使用已经存在的类的属性,而不是做额外的工作。现在我需要弄清楚如何根据选定的主题选择常量。另外,额外的代码可能会增加出现错误的可能性。@BadrB是否有扩展主题数据的方法?如果我可以为2种颜色的主题数据添加其他属性,那么我可以使用这些颜色,比如:渐变:LinearGradient(颜色:[Theme.of(context).color1,Theme.of(context.color2])。无论主题何时改变,这些值都会相应地改变。