【问题标题】:Flutter Custom TextTheme With Adaptive TextSizeFlutter Custom TextTheme with Adaptive TextSize
【发布时间】:2021-04-07 02:57:05
【问题描述】:

我创建了自定义 ThemeDatas(浅色和深色),当我使用它们启动我的应用程序时,我遇到了 _mulFromInteger() 问题。这是因为我的 ThemeData 中 TextTheme 中的 FontSizes 具有根据屏幕大小而变化的值,为了使这些自适应 FontSizes 我使用包含我的大小配置的类。此类调用 MediaQuery.of(context) 将在功能上修改我的屏幕配置为其值。问题是我在调用我的 SizeConfigurations.init(context) 之前调用了我的 ThemeData(带有 TextTheme)。如果我在创建 MaterialApp 并设置主题之前尝试将我的初始化程序告诉我我使用了没有 MediaQuery 的上下文。知道如何解决这个问题吗?谢谢:)

代码:

  @override
  Widget build(BuildContext context) {
    // When I call SizeConfig().init(context); here it tells me the context doesn't have a MediaQuery
    return MaterialApp(
      theme: AppTheme.getLightTheme(),
      darkTheme: AppTheme.getDarkTheme(),
      themeMode: ThemeMode.system,
      title: 'App Title',
      onGenerateRoute: NavigationRouter.generateRoute,
      home: FutureBuilder(
        future: jwtOrEmpty,            
        builder: (context, snapshot) {
          SizeConfig().init(context);
          …
        }
      ),
    );
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    您可以使用MediaQueryData.fromWindow(ui.window)
    代码sn-p

    void init() {
        _mediaQueryData = MediaQueryData.fromWindow(ui.window);
        _screenWidth = _mediaQueryData.size.width;
        _screenHeight = _mediaQueryData.size.height;
    

    完整代码

    import 'package:flutter/material.dart';
    import 'dart:ui' as ui;
    
    class SizeConfig {
      static MediaQueryData _mediaQueryData;
      static double _screenWidth;
      static double _screenHeight;
    
      double get screenWidth => _screenWidth;
      double get screenHeight => _screenHeight;
    
     void init() {
        _mediaQueryData = MediaQueryData.fromWindow(ui.window);
        _screenWidth = _mediaQueryData.size.width;
        _screenHeight = _mediaQueryData.size.height;
        print(_screenWidth);
        print(_screenHeight);
      }
    }
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        SizeConfig().init();
    
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        print(MediaQuery.of(context).size.width);
        print(MediaQuery.of(context).size.height);
        print(SizeConfig().screenWidth);
    
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 1970-01-01
      • 2022-12-01
      • 2022-12-28
      • 2022-12-01
      • 1970-01-01
      • 2021-10-01
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多