self:python
import 'package:flutter/material.dart'; class GrantScreen { static double _width, _height; static double _physicalWidth, _physicalHeight; static double _top, _bottom; static double _scaleWidth, _scaleHeight; static double _textScale; static double _pixelRatio; GrantScreen(BuildContext context){ _physicalWidth = MediaQuery.of(context).size.width; _physicalHeight = MediaQuery.of(context).size.height; _top = MediaQuery.of(context).padding.top; _bottom = MediaQuery.of(context).padding.bottom; _textScale = MediaQuery.of(context).textScaleFactor; _width = 375.0; _height = 667.0; _scaleWidth = _physicalWidth / _width; _scaleHeight = _physicalHeight / _height; _pixelRatio = MediaQuery.of(context).devicePixelRatio; } get top => _top / _scaleHeight; get bottom => _bottom / _scaleHeight; get scaleWidth => _scaleWidth; get scaleHeight => _scaleHeight; get width => _width; get height => _height; get pixelRatio => _pixelRatio; get physicalWidth => _physicalWidth; get physicalHeight => _physicalHeight; setWidth(double w) => w * _scaleWidth; setHeight(double h) => h * _scaleHeight; setFontSize(double f, [bool allowScale=true]) => allowScale? setWidth(f)/_textScale : f/_textScale; getGlobalPosition(DragDownDetails details){ double dx = details.globalPosition.dx / _scaleWidth; double dy = details.globalPosition.dy / _scaleHeight; return DragDownDetails(globalPosition: Offset(dx, dy)); } }
mainapp
import 'package:flutter/material.dart'; import 'screen.dart'; main() => runApp(MaterialApp( home: MyApp(), )); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { var x = MediaQuery.of(context).size; print('original size: $x'); GrantScreen screen = GrantScreen(222, 444, context); return RootWidget( child: HomePage(), screen: screen, ); } } class RootWidget extends InheritedWidget { RootWidget({Key key, @required this.child, this.screen}):super(key:key); final GrantScreen screen; final Widget child; static RootWidget of(BuildContext context){ return context.inheritFromWidgetOfExactType(RootWidget); } @override bool updateShouldNotify(InheritedWidget oldWidget) { return true; } } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { var s = RootWidget.of(context).screen; return Scaffold( appBar: AppBar(title: Text('ABC', style: TextStyle(fontSize: 22),),), body: GestureDetector( onPanDown: (DragDownDetails details){ print('mmmmmmmmmmmmmmmmmmmmmm'); print(details); print(s.getGlobalPosition(details)); print('new top: ${s.top}'); print(MediaQuery.of(context).padding.top); print('mmmmmmmmmmmmmmmmmmmmmmmm'); }, child: Container( width: double.infinity,height: double.infinity, color: Colors.grey, child: Column( children: <Widget>[ Text('Text', style: TextStyle(fontSize: s.setFontSize(44, true)),), Text('Text', style: TextStyle(fontSize: s.setFontSize(44, false)),), Text('Text', style: TextStyle(fontSize: 44),), ], ), ),), ); } }
screen:less
import 'package:flutter/material.dart'; class GrantScreen { static double _width, _height; static double _physicalWidth, _physicalHeight; static double _top, _bottom; static double _scaleWidth, _scaleHeight; static double _textScale; static double _pixelRatio; GrantScreen(double w, double h, BuildContext context){ _physicalWidth = MediaQuery.of(context).size.width; _physicalHeight = MediaQuery.of(context).size.height; _top = MediaQuery.of(context).padding.top; _bottom = MediaQuery.of(context).padding.bottom; _textScale = MediaQuery.of(context).textScaleFactor; _width = w; _height = h; _scaleWidth = _physicalWidth / w; _scaleHeight = _physicalHeight / h; _pixelRatio = MediaQuery.of(context).devicePixelRatio; } get top => _top / _scaleHeight; get bottom => _bottom / _scaleHeight; get scaleWidth => _scaleWidth; get scaleHeight => _scaleHeight; get width => _width; get height => _height; get pixelRatio => _pixelRatio; get physicalWidth => _physicalWidth; get physicalHeight => _physicalHeight; setWidth(double w) => w * _scaleWidth; setHeight(double h) => h * _scaleHeight; setFontSize(double f, [bool allowScale=true]) => allowScale? setWidth(f)/_textScale : f/_textScale; getGlobalPosition(DragDownDetails details){ double dx = details.globalPosition.dx / _scaleWidth; double dy = details.globalPosition.dy / _scaleHeight; return DragDownDetails(globalPosition: Offset(dx, dy)); } }