【问题标题】:Changing theme using GetX使用 GetX 更改主题
【发布时间】:2021-01-20 14:53:00
【问题描述】:

我只想在特定路线上将主题更改为redTheme。为此,我使用了routingCallback like

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'App',
      theme: defaultTheme(context),
      initialRoute: AppPages.INITIAL,
      getPages: AppPages.routes,
      routingCallback: (routing) => _routingCallback(context, routing),
    );
  }

  _routingCallback(BuildContext context, Routing routing) {
    if (routing.current == Routes.PURSUE_MODE) {
      _changeThemeIfNeeded(redTheme(context));
    } else {
      _changeThemeIfNeeded(defaultTheme(context));
    }
  }

  void _changeThemeIfNeeded(ThemeData theme) {
    Get.changeTheme(theme);
  }
}

不幸的是,它导致

════════ 小部件库捕获的异常 ══════════════════════════════════════════════════ ═════ setState() 或 markNeedsBuild() 在构建期间调用。相关的错误原因 小部件是:方向性 file:///Users/jakub/.pub-cache/hosted/pub.dartlang.org/get_navigation-3.12.0/lib/src/root/root_widget.dart:235:22 ══════════════════════════════════════════════════ ══════════════════════════════════════════════════

因此,我将主题更改包装在 try-catch 块中,所以一开始我没有遇到异常

  void _changeThemeIfNeeded(ThemeData theme) {
    try {
      if (Get.theme != theme) {
        Get.changeTheme(theme);
      }
    } catch (e) {
      print('Not ready e = $e');
    }
  }

但我相信使用Get 框架有更优雅的方法来解决这个问题?

【问题讨论】:

    标签: flutter flutter-get


    【解决方案1】:

    我对 GetX 不是很熟悉。但是,为了避免setState() or markNeedsBuild() called during build. 错误,您可以在您的情况下使用addPostFrameCallback,如下所示:

    routingCallback: (routing) => WidgetsBinding.instance
          .addPostFrameCallback((_) => _routingCallback(context, routing)) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-09
      • 2021-03-17
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多