【问题标题】:Can't use MediaQuery with the builder parameter of MaterialApp in flutter's new versions在flutter的新版本中不能使用MediaQuery和MaterialApp的builder参数
【发布时间】:2021-08-17 10:56:07
【问题描述】:

我能够在以前版本的 Flutter 中使用此代码:

return MaterialApp(
  builder: (BuildContext context, Widget child) {
    final MediaQueryData data = MediaQuery.of(context);
    return MediaQuery(
      data: data.copyWith(
          textScaleFactor: data.textScaleFactor * _settings.appFontSizeFactor),
      child: child,
    );
  },
  ...
);

但是,对于新版本的 Flutter,如果我像上面那样使用它,我会收到以下错误:
参数类型 'MediaQuery Function(BuildContext, Widget)' can' t被分配给参数类型'Widget Function(BuildContext, Widget?)?'.dartargument_type_not_assignable

这只发生在新版本的 Flutter 中。我在以前的 Flutter 版本中编写的其他应用程序仍然可以像上面一样使用。在 MaterialApp 的 builder 参数中找不到使用 MediaQuery 的新方法。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    澄清一下,您的意思不是“Flutter 的新版本”,您的意思是“在现代模式下运行的 dart 的 null 安全版本,而不是传统模式”。请不要将此问题归咎于颤振升级。责备自己试图绕过https://dart.dev/null-safety/migration-guide 中列出的步骤。我打赌你直接编辑了你的 pubspec.yaml minimumsdk。不要那样做。

    【讨论】:

    • 我已经知道了。请仔细阅读问题。我不质疑新版本,我想知道人们现在如何使用这个 MediaQuery 来更改 MaterialApp 的 textScaleFactor。在旧版本中,我们可以像上面那样使用它。就这样。我明白那个错误是什么意思。这是来自全新的项目。如果你真的知道,也许你可以展示“现代方式”。
    • 您是否尝试过在旧版本的代码上运行 dart migrate 以查看会发生什么变化?
    • 我修复了它并添加了我的答案。如果您编辑您的答案*并添加我发布的确切解决方案,我可以选择您的答案而不是我的答案。
    【解决方案2】:
      builder: (BuildContext context, Widget? child) { // updated line
        final MediaQueryData data = MediaQuery.of(context);
        return MediaQuery(
          data: data.copyWith(
              textScaleFactor: data.textScaleFactor * _settings.appFontSizeFactor),
          child: child!,  // updated line
        );
      },
      ...
    );
    

    就是这样。这是关于零安全性的。

    【讨论】:

    • 您已经用编译时安全换取了运行时异常。如果它真的应该中止你的程序,干得好。但是,您可能希望确保上游传递的是 Widget,而不是“Widget?”。
    • 这就是您建议的“dart migrate”命令的作用。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2020-02-17
    • 2019-12-11
    • 1970-01-01
    • 2021-04-02
    • 2019-01-18
    • 2019-12-18
    相关资源
    最近更新 更多