android - Flutter中的响应式UI
问题描述
在 Ui 边距中,内边距、文本和图像大小被赋予恒定值。我没用Fractional box
等等Constraint box
..我需要根据屏幕大小通过设置media query
我使用了这样的媒体查询,但无法正确设置。
double width = MediaQuery.of(context).size.width;
double height = MediaQuery.of(context).size.height;
double height35 = height * 0.35;
如果我的填充是padding:const EdgeInsets.only(left: 25.0,right: 25.0)
,我如何从媒体查询中设置填充和其他固定大小。这里 1,这里 2
是文档和示例,但没有从媒体查询中获得方法..
我也使用过这个库,但它没有我想要的那么有效。
这是我的代码。
class _LoginPageState extends State<LoginPage> {
@override
Widget build(BuildContext context) {
MediaQueryData queryData;
queryData = MediaQuery.of(context);
double width = MediaQuery.of(context).size.width;
double height = MediaQuery.of(context).size.height;
double height35 = height * 0.35;
return Scaffold(
body: Container(
decoration: BoxDecoration(color: Color(0xFFE7F6FD)),
child: Column(
children: <Widget>[
SizedBox(height: height35,),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
height: 50.0,
child: IconButton(icon: Icon(Icons.close,color: Color(0xFF005283),size: 36.0,), onPressed: null),
),
],),
Container(child: SingleChildScrollView(
padding:const EdgeInsets.only(left: 25.0,right: 25.0),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
height: 60.0,
child: Image.asset('assets/images/login_logo.png')),
SizedBox(
height: 30.0,
),
TextFormField(
style: new TextStyle(fontSize:18.0,color: Color(0xFF005283)),
decoration: InputDecoration(
// prefixIcon: Icon(Icons.email, color: Colors.grey),
enabledBorder: UnderlineInputBorder(borderSide: new BorderSide(color: Color(0xFF005283))),
hintStyle: TextStyle(color: Color(0xFF005283),fontSize:18.0,fontFamily: "WorkSansLight"),
hintText: 'Email/Mobile No.'),
),
SizedBox(
height: 30.0,
),
TextFormField(
style: new TextStyle(fontSize:18.0,color: Color(0xFF005283)),
obscureText: true,
decoration: InputDecoration(
// prefixIcon: Icon(Icons.email, color: Colors.grey),
labelStyle: new TextStyle(color: Colors.blue),
enabledBorder: UnderlineInputBorder(borderSide: new BorderSide(color: Color(0xFF005283))),
hintStyle: TextStyle(color: Color(0xFF005283),fontSize:18.0,fontFamily: "WorkSansLight"),
hintText: 'Password'),
),
SizedBox(
height: 30.0,
),
RaisedButton(
onPressed: () {
},
shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(60.0)),
child: Padding(
padding: EdgeInsets.only(top:18.0,bottom: 18.0,left: 10.0,right: 10.0),
child: Text('LOG IN',style: new TextStyle(fontSize:18.0,color: Color(0xFF005283),fontFamily: "WorkSansMedium"),)),
color: Color(0xFFc1ff02),
textColor: Colors.white,),
SizedBox(
height: 30.0,),
Row(
children: <Widget>[
Expanded(
child: Divider(
color: Color(0xFF005283),
height: 8.0,
),
),
SizedBox(
width: 8.0,
),
Text(
'OR CONNECT WITH',
style: TextStyle(fontSize:14.0,color: Color(0xFF005283),fontFamily: "WorkSansLight",fontWeight: FontWeight.normal),
),
SizedBox(
width: 8.0,
),
Expanded(
child: Divider(
color: Color(0xFF005283),
height: 8.0,
),
)
],
),
Row(
children: <Widget>[
FlatButton.icon(
onPressed: null,
label: Text('Login with Facebook',style: TextStyle(color: Colors.white),),
icon: Icon(Icons.local_gas_station,color: Colors.white,),
shape: Border.all(color: Colors.grey,width: 2.0,style: BorderStyle.none ),
//shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0),)
),
OutlineButton(
color: Colors.black,
child: new Text("Button text"),
onPressed: null,
shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0))
),
],
),
SizedBox(
height: 20.0,
),
Center(
child: GestureDetector(
onTap: () {
Navigator.pushNamed(context, "myRoute");
},
child: RichText(
text: new TextSpan(
children: <TextSpan>[
TextSpan(text:'Not a Member? ',style: TextStyle(color: Color(0xFF005283),fontSize: 14.0,fontWeight: FontWeight.w400),),
TextSpan(text:'Register Now',style: TextStyle(color: Color(0xFF005283),fontSize: 18.0,fontWeight: FontWeight.w600),),
],
),
),
) ,
),
SizedBox(
height: 20.0,
),
OutlineButton(
color: Color(0xFF005283),
child: new Text("CONTINUE AS GUEST",style: TextStyle(color: Color(0xFF005283),fontSize: 14.0,)),
onPressed: null,
shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0))
),
],),))
],
),
),
);
}
}
解决方案
来自 devicePixelRatio 属性的文档: https ://docs.flutter.io/flutter/dart-ui/Window/devicePixelRatio.html
每个逻辑像素的设备像素数。这个数字可能不是二的幂。事实上,它甚至可能不是整数。例如,Nexus 6 的设备像素比为 3.5。
设备像素也称为物理像素。逻辑像素也称为与设备无关或与分辨率无关的像素。
根据定义,物理显示器每厘米大约有 38 个逻辑像素,或每英寸大约有 96 个逻辑像素。devicePixelRatio 返回的值最终是从硬件本身、设备驱动程序或存储在操作系统或固件中的硬编码值获得的,并且可能不准确,有时相差很大。
Flutter 框架以逻辑像素运行,因此很少需要直接处理这个属性。
所以你真的不必担心设备分辨率,但如果你想访问该属性,你可以像下面这样:
double devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
推荐阅读
- c# - c#如何获取最后一个div元素?
- or-tools - Or-tools 路由节点与索引
- python-3.x - 如何在 conda 中创建具有多个通道的环境
- r - 仅在开始输入 R Shinyapp 时才显示下拉菜单
- google-cloud-platform - GCR (Google Cloud Run) 启用 http
- c - bash:./remoteServer .o:无法执行二进制文件:执行格式错误
- c# - 在 List 的派生类上设置属性
在运行时使用反射实例化 - python - Flask socketServer 请求错误-python 3.8
- python - 没有跨度文本的 td 中的 Python/Selenium 文本
- javascript - 字符串结尾的正则表达式 url 模式匹配