Flutter - Get.changeTheme仅适用于ios模拟器

dohp0rv5  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(153)

这是一种非常奇怪的行为。我有四个不同的主题。在我的控制器里
class Controller extends GetxController { ..
我使用控制器final Controller c = Get.put(Controller());在事件上设置当前主题,如下所示:

void setAppMode(AppMode mode) async {
    appMode.value = mode;
    switch (appMode.value) {
      case AppMode.first:
        Get.changeTheme(firstTheme);
        break;
      case AppMode.second:
        Get.changeTheme(secondTheme);
        break;
      case AppMode.third:
        Get.changeTheme(thirdTheme);
        break;
      default:
        Get.changeTheme(firstTheme);
        break;
    }
  }

这实际上适用于iOS模拟器,但不适用于Chrome和MacOS。
在实现GetX之前,我确实实现了一个提供程序方法,它很简单。我切换到getx,我几乎可以肯定它在所有平台上都工作了一段时间,然后停止了。
我实际上找不到getx成功更改主题的切换后的提交(即使,再一次,我很确定它是工作的)。
另一个奇怪的迹象是,我的徽标图像(沿着主题而改变)即使没有被Obx Package ,也会在iOS模拟器中更新,而在macos和chrome中,它需要 Package (所以实际上说这段代码

Center(
       child: Image.asset(
            c.getLogoPath(),
       ),
),

足以让ios模拟器在事件上更新徽标图像,而在chrome或macos中我需要这个

Center(
       child: Obx(() => Image.asset(
             c.getLogoPath(),
       )),
),

即使在这种情况下,我也很确定它在从提供程序切换到GetX后立即工作,而不需要Obx Package 。我也确信我已经退出并重新构建了运行时)。
运行时中是否存在任何“缓存”问题?怎么了?我的Flutter知识不让我明白问题可能隐藏在哪里。
顺便说一句,我很清楚,有些事情并不像它应该的那样表现。
有什么提示吗?

更新这似乎与一个bug有关:https://github.com/jonataslaw/getx/issues/1878

5ssjco0h

5ssjco0h1#

这不是一个解决方案,而是一个变通办法:将GetMaterialApp Package 到Multiprovider中,我可以混合在平台上切换的方法,如下所示:

import 'dart:io';
...
class Controller extends GetxController {
...
final themeProvider = Provider.of<ThemeProvider>(Get.context!);//this actually makes the trick
...
void setAppMode(AppMode mode) {
...
changeTheme(themeBasedOnReceivedMode);
}
...
void changeTheme(ThemeData theme) {
    if (Platform.isAndroid || Platform.isIOS) {
      // Code for  Android and iOS
      print('ios/android');
      Get.changeTheme(theme);
    } else {
      // Code for other platforms
      print('macos/windows/linux');
      themeProvider.themeData = theme;
    }
  }

而app builder应该是这样的:

Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          ChangeNotifierProvider(create: (_) => ThemeProvider()),
        ],
        child: Consumer<ThemeProvider>(
            builder: (context, themeProvider, child) => GetMaterialApp(
                  title: 'MyApp',
                  theme: themeProvider.themeData,
                  home: const SafeArea(child: AppWrapper()),
                )));
  }

相关问题