【问题标题】:Flutter change theme and icon of a iconbutton with GetxFlutter 使用 Getx 更改图标按钮的主题和图标
【发布时间】:2021-10-09 07:54:26
【问题描述】:

我有以下示例使用 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());
              })
        ],
      ),
    );
  }
}


【问题讨论】:

  • 嗨奥古斯丁。我已经尝试过替换。主题改变,但图标不变。

标签: flutter dart flutter-getx


【解决方案1】:

您需要将图标包装在 GetX 小部件中,该小部件基于 GetX 类中的变量进行重建。

使用根据本地布尔值更改主题的函数创建 Getx 类。

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 无法使用,因为我的网络速度非常慢,而且我正在进行数小时的 Flutter 升级。所以可能会有一些语法或轻微的格式错误,但除此之外这应该可以工作。

【讨论】:

  • 谢谢洛伦。它就像你展示的那样工作。同时,我更改为 StatefulWidget 并将 setState 添加到按钮,它也给了我想要的结果。但我会说明你的选择。再次感谢
  • 嗨,罗伦。还有一些方法可以使 Getx 的主题持久化吗?
  • 我在这里回答了一个关于持久主题的类似问题,应该可以帮助您。 stackoverflow.com/questions/66587052/…
  • 超级。谢谢...这正是我需要的...我会尝试一下
猜你喜欢
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
相关资源
最近更新 更多