如何在整个应用程序中而不是为每个页面设置MediaQuery textScaleFactor



Main

final query = MediaQuery.of(context);
return MediaQuery(
data: query.copyWith(textScaleFactor: 1.4),
child: MaterialApp(
title: "Flutter Demo",
initialRoute: '/loginPage',
)
);
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (13775): The following assertion was thrown building MyApp(dirty, state: _MyAppState#38690):
I/flutter (13775): MediaQuery.of() called with a context that does not contain a MediaQuery.
I/flutter (13775): No MediaQuery ancestor could be found starting from the context that was passed to MediaQuery.of().
I/flutter (13775): This can happen because you do not have a WidgetsApp or MaterialApp widget (those widgets introduce
I/flutter (13775): a MediaQuery), or it can happen if the context you use comes from a widget above those widgets.

使用MediaQuery类及其data属性,我想为整个应用程序设置textScaleFactor条件,但我无法在MaterialApp之前获取上下文。。。

所以我不想为我添加的每一个页面添加类,比如parent,我怎么能为整个应用程序只添加一次类呢?

登录页面(它有效,但我不想要这个)

final query = MediaQuery.of(context);
return MediaQuery(
data: query.copyWith(textScaleFactor: 1.4),
child: Scaffold(
[...]
);

谢谢你,

最简单的方法是用另一个MaterialApp包装MaterialApp并设置useInheritedMediaQuery:

return MaterialApp(
home: LayoutBuilder(
builder: (context, _) { # builder so we can access MaterialApp context
final query = MediaQuery.of(context);
return MediaQuery(
data: query.copyWith(textScaleFactor: 1.4),
child: MaterialApp( 
useInheritedMediaQuery: true, #inherited MediaQuery will be used
....

另一种方法是使用WidgetsBinding.instance.window.physicalSizehttps://stackoverflow.com/a/60415290/4679965

过了一段时间,我能够在不使用其他MaterialApp或WidgetsApp的情况下以以下方式解决它。

MaterialApp(
debugShowCheckedModeBanner: false,
navigatorKey: navigatorKey, // here
onGenerateRoute: RouteGenerator.generateRoute,
[...]
builder: (BuildContext context, Widget? child) => MediaQuery(
data: MediaQuery.of(context).copyWith(
textScaleFactor: MediaQuery.of(context)
.textScaleFactor
.clamp(1.0, 1.4),
),
child: child ?? const SizedBox.shrink(),
),
),

在我的路线生成器文件中创建一个全局变量,并仅在应用程序材料中调用它

[...]
import 'package:flutter/material.dart';
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
class RouteGenerator {
[...]

最新更新