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.physicalSize
https://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 {
[...]