Flutter 使用 Getx 更改主题和 iconbutton 的图标
Flutter change theme and icon of a iconbutton with Getx
我有以下示例使用 Getx 从暗模式更改为亮模式。到目前为止它正在工作。但我也希望改变主题的 IconButton 也会改变自己的图标。
我做错了什么?
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
title: 'Change Theme',
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.system,
home: HomeScreen(),
);
}
}
// Home Screen
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
var selected = true;
return Scaffold(
appBar: AppBar(
title: Text('Change Theme'),
actions: [
IconButton(
icon: Icon(
selected ? Icons.dark_mode : Icons.light_mode,
),
onPressed: () {
Get.isDarkMode
? Get.changeTheme(ThemeData.light())
: Get.changeTheme(ThemeData.dark());
})
],
),
);
}
}
您需要将图标包装在 GetX
小部件中,该小部件根据 GetX
class.
中的变量重建
创建一个 Getx class,其中包含根据本地布尔值更改主题的函数。
class ThemeController extends GetxController {
bool isDarkMode = true;
void toggleDarkMode() {
isDarkMode = !isDarkMode;
if (isDarkMode) {
Get.changeTheme(ThemeData.dark());
} else {
Get.changeTheme(ThemeData.light());
}
update();
}
然后将您的图标包裹在 GetBuilder<ThemeController>
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
Get.put(ThemeController());
return Scaffold(
appBar: AppBar(
title: Text('Change Theme'),
actions: [
GetBuilder<ThemeController>(
builder: (controller) => IconButton(
icon: Icon(
controller.isDarkMode ? Icons.dark_mode : Icons.light_mode,
),
onPressed: () => controller.toggleDarkMode()
],
),
);
}
}
我的 VsCode 没有佣金,因为我旅行时网速非常慢,而且我正在进行数小时的不稳定升级。所以可能会有一些语法或小的格式错误,但除此之外这应该有效。
我有以下示例使用 Getx 从暗模式更改为亮模式。到目前为止它正在工作。但我也希望改变主题的 IconButton 也会改变自己的图标。 我做错了什么?
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
title: 'Change Theme',
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.system,
home: HomeScreen(),
);
}
}
// Home Screen
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
var selected = true;
return Scaffold(
appBar: AppBar(
title: Text('Change Theme'),
actions: [
IconButton(
icon: Icon(
selected ? Icons.dark_mode : Icons.light_mode,
),
onPressed: () {
Get.isDarkMode
? Get.changeTheme(ThemeData.light())
: Get.changeTheme(ThemeData.dark());
})
],
),
);
}
}
您需要将图标包装在 GetX
小部件中,该小部件根据 GetX
class.
创建一个 Getx class,其中包含根据本地布尔值更改主题的函数。
class ThemeController extends GetxController {
bool isDarkMode = true;
void toggleDarkMode() {
isDarkMode = !isDarkMode;
if (isDarkMode) {
Get.changeTheme(ThemeData.dark());
} else {
Get.changeTheme(ThemeData.light());
}
update();
}
然后将您的图标包裹在 GetBuilder<ThemeController>
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
Get.put(ThemeController());
return Scaffold(
appBar: AppBar(
title: Text('Change Theme'),
actions: [
GetBuilder<ThemeController>(
builder: (controller) => IconButton(
icon: Icon(
controller.isDarkMode ? Icons.dark_mode : Icons.light_mode,
),
onPressed: () => controller.toggleDarkMode()
],
),
);
}
}
我的 VsCode 没有佣金,因为我旅行时网速非常慢,而且我正在进行数小时的不稳定升级。所以可能会有一些语法或小的格式错误,但除此之外这应该有效。