我在flutter中创建了一个简单的登录UI,但我不知道如何使应用程序的整体主题变得黑暗。我的意思是,将来,如果我向应用程序添加更多功能,它应该都在黑暗主题中。有没有办法做到这一点?
我使用了一个单独的 dart 文件 (login.dart),我的登录 UI 中使用的所有小部件都在这个文件中。我已在主 dart 文件 (main.dart) 中将 ThemeData 设置为深色,但该应用程序仍在以浅色主题运行。
这是我的代码:
main.dart
import 'package:flutter/material.dart';
import 'package:bidder_login/login.dart';
void main(){
runApp(
MaterialApp(
theme: ThemeData(),
darkTheme: ThemeData.dark(),
debugShowCheckedModeBanner: false,
title: "Basic Login Demo",
home: LoginPage(),
),
);
}
Run Code Online (Sandbox Code Playgroud)
登录.dart
import 'package:flutter/material.dart';
class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 24.0),
children: <Widget>[
SizedBox(height: 80.0),
// Column(
// children: <Widget>[ …Run Code Online (Sandbox Code Playgroud) 我希望每个Text特定的内部Widget都有白色,尽管它们都可以有不同的大小。我知道我可以将每个单曲更改Text为白色,但我想让它变得智能并更改该特定的主题Widget。
我试过这个:
DefaultTextStyle.merge(
style: TextStyle(color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Text 1',
style: Theme.of(context).textTheme.title,
),
Text('Text 2')
],
),
),
Run Code Online (Sandbox Code Playgroud)
问题是Text 1变成黑色,Text 2变成我想要的白色。
我认为使用DefaultTextStyle.merge我仍然能够使用Theme.of(context)来获得一般TextTheme,仍然保持更改DefaultTextStyle,但显然我错了。
更改子树文本颜色同时能够访问原始文本的其余部分的正确方法是什么Theme?
我可以使用主题更改过渡动画MaterialApp。下面的示例用FadeTransition. 使用淡入淡出过渡时感觉很慢,我无法弄清楚如何更改主题中设置的过渡的持续时间。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
final themeData = ThemeData(
pageTransitionsTheme: PageTransitionsTheme(builders: {
TargetPlatform.iOS: FadeTransitionBuilder(),
TargetPlatform.android: FadeTransitionBuilder(),
}),
);
class FadeTransitionBuilder extends PageTransitionsBuilder {
@override
Widget buildTransitions<T>(_, __, animation, ___, child) => FadeTransition(opacity: animation, child: child);
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Mobile',
theme: themeData,
initialRoute: '/',
routes: routes,
);
} …Run Code Online (Sandbox Code Playgroud) 我将文本样式保存在单独的text_styles.dart文件中。当我想使用像 Theme.of(context).primaryColor 这样的主题颜色时,我无法从 到达 ThemeData 对象。text_styles.dart我用这种解决方案解决了我的问题,但这不是一个好的解决方案。
TextStyle kWelcomePageHeaderTextStyle(BuildContext context) => TextStyle(
fontFamily: "Courgette",
fontSize: 30.0,
color: Theme.of(context).primaryColor,
);
Run Code Online (Sandbox Code Playgroud)
所以,我需要从静态区域获取 ThemeData 以便像这样使用我的文本样式。
const kWelcomePageHeaderTextStyle = TextStyle(
fontFamily: "Courgette",
fontSize: 30.0,
color: [THEME_DATA_OBJECT_NEEDED].primaryColor,
);
Run Code Online (Sandbox Code Playgroud)
我可以从 text_styles.dart 获取 ThemeData 对象还是有更好的解决方案?
这是我在颤动中用于复选框的内容。但我只能为未选中状态设置边框颜色,而不能为复选框内的填充颜色找到方法。请在这件事上给予我帮助。
Theme(
data: ThemeData(unselectedWidgetColor: Colors.white),
child: Checkbox(
checkColor: Colors.blue,
activeColor: Colors.white,
value: rememberMe,
onChanged: (value) {
setState(() {
rememberMe = value;
});
},
),
)
Run Code Online (Sandbox Code Playgroud) 我有这个主题数据:
import 'package:flutter/material.dart';
import 'package:vepo/fonts.gen.dart';
import 'theme_utils.dart';
MaterialColor primarySwatch = generateMaterialColor(primaryColorMid);
MaterialColor lightGreenSwatch = generateMaterialColor(lightGreenColorMid);
MaterialColor accentSwatch = generateMaterialColor(accentColor);
const primaryColorMid = Color(0xFF379e97);
const lightGreenColorMid = Color(0xFF5ccc89);
const darkBackgroundColor = Color(0xff303030);
const accentColor = Color(0xff3F51B5);
const errorColor = Color(0xffb03e3e);
Color initialGradientColor = lightGreenSwatch[300];
Color endGradientColor = primarySwatch[900];
Color blueText = lightGreenSwatch[500];
ThemeData homeTheme = ThemeData(
accentColor: primaryColorMid,
primarySwatch: primarySwatch,
colorScheme: ColorScheme(
brightness: Brightness.light,
primary: primarySwatch[500],
secondary: accentSwatch[500],
surface: Colors.white,
background: primarySwatch,
error: Colors.red[50],
onBackground: Colors.white,
onError: errorColor,
onPrimary: Colors.white,
onSecondary: …Run Code Online (Sandbox Code Playgroud) 在定义ThemeDataFlutter 应用程序时,我们可以定义colorScheme属性。该属性具有background& onBackground、primary& onPrimary、secondary&等内部属性onSecondary。此外,所有这些属性都设置为required。
static final ThemeData lightTheme = ThemeData(
colorScheme: ColorScheme(
background: appBackgroundColor,
brightness: Brightness.light,
error: Colors.white,
onBackground: primaryColor,
onError: null,
onPrimary: null,
onSecondary: null,
onSurface: null,
primary: null,
secondary: secondaryColor,
surface: null,
),
);
Run Code Online (Sandbox Code Playgroud)
我尝试参考Flutter 的文档,但不太明白它们之间的区别。
如何通过 themedata 将 sideBorder 实现为levedButton。在此输入图像描述
elevatedButtonTheme: ElevatedButtonThemeData(
style: ButtonStyle(side: MaterialStateProperty<BorderSide>//Stuck here),
),
Run Code Online (Sandbox Code Playgroud) 我有一个 Flutter 应用程序,它使用 Android 的 Material 主题和 iOS 的 Cupertino 主题。但我Card在两个主题中都使用了 widget,它是一个 Material widget。现在我有以下代码main.dart
Widget build(BuildContext context) => PlatformProvider(
builder: (BuildContext context) => PlatformApp(
cupertino: (_, __) => CupertinoAppData(
theme: CupertinoThemeData(brightness: Brightness.light, ...)),
material: (_, __) => MaterialAppData(
theme: ThemeData(
brightness: Brightness.light,
primarySwatch: Colors.deepPurple,
cardTheme: CardTheme(
color: Colors.grey,
...
)
...
),),
......
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该小部件在 Material 中Card使用了主题,但在 中没有相应的主题。所以在 iOS 上,s 只使用他们的默认主题。cardThemeThemeDatacardThemeCupertinoThemeDataCard
那么如何像Card库比蒂诺主题那样为 Material 小部件设置主题呢?