面试题答案
一键面试定制应用主题
- 创建主题数据:在Flutter中,可以通过
ThemeData
类来创建应用的主题数据。例如,定制颜色和字体:
final ThemeData myTheme = ThemeData(
primarySwatch: Colors.blue, // 主色板
fontFamily: 'Roboto', // 字体
textTheme: const TextTheme(
headline1: TextStyle(fontSize: 72.0, fontWeight: FontWeight.bold),
bodyText2: TextStyle(fontSize: 14.0, fontFamily: 'Hind'),
),
);
- 应用主题:在
MaterialApp
中应用定义好的主题:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: myTheme,
home: HomePage(),
);
}
}
主题动态切换
- 定义多个主题:分别定义白天和黑夜主题:
final ThemeData lightTheme = ThemeData(
primarySwatch: Colors.blue,
brightness: Brightness.light,
// 其他白天主题相关设置
);
final ThemeData darkTheme = ThemeData(
primarySwatch: Colors.grey,
brightness: Brightness.dark,
// 其他黑夜主题相关设置
);
- 使用
InheritedWidget
或状态管理:这里以状态管理为例,使用Provider
库。- 安装
provider
库:在pubspec.yaml
文件中添加provider: ^[最新版本号]
并运行flutter pub get
。 - 创建主题状态管理类:
- 安装
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ThemeProvider with ChangeNotifier {
ThemeData _currentTheme;
ThemeProvider(this._currentTheme);
ThemeData get currentTheme => _currentTheme;
void switchTheme(ThemeData theme) {
_currentTheme = theme;
notifyListeners();
}
}
- 应用主题切换逻辑:
- 在
main.dart
中设置Provider
:
- 在
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => ThemeProvider(lightTheme),
child: MyApp(),
),
);
}
- 在页面中实现按钮切换主题:
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final themeProvider = Provider.of<ThemeProvider>(context);
return Scaffold(
appBar: AppBar(title: Text('主题切换示例')),
body: Center(
child: ElevatedButton(
onPressed: () {
if (themeProvider.currentTheme.brightness == Brightness.light) {
themeProvider.switchTheme(darkTheme);
} else {
themeProvider.switchTheme(lightTheme);
}
},
child: Text(
themeProvider.currentTheme.brightness == Brightness.light
? '切换到黑夜模式'
: '切换到白天模式',
),
),
),
);
}
}
这样就实现了在Flutter中定制应用主题以及动态切换主题的功能。