方向更改处理是否与使用Flutter中的更新维度重新运行小部件的构建一样简单?
我问,因为在Android中,重建了整个Activity,这就是为什么所有信息都是通过意图发送的。
在设计小部件时要记住任何问题,以便他们处理方向更改或其他导致UI更改的更改?
答案 0 :(得分:7)
基本上 - 是的!现在,更具体地说,MediaQuery
小部件侦听方向/大小/布局更改并重建它的子级。此小部件已经是MaterialApp
和WidgetsApp
小部件的一部分,因此您可能不需要包含它。
如果您希望小部件利用设备方向,可以使用MediaQuery.of
静态成员访问包含设备方向的MediaQueryData
。例如,一个简单的小部件,以纵向和横向显示不同的文本(需要是MaterialApp
,WidgetsApp
或MediaQuery
的孩子。
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
final mediaQueryData = MediaQuery.of(context);
if (mediaQueryData.orientation == Orientation.landscape) {
return const Text('landscape');
}
return const Text('portrait!');
}
}
答案 1 :(得分:3)
这将帮助您即使用户正在旋转SmartPhone,也可以强制Flutter应用程序保持纵向(垂直)模式
void main(){
///
/// Force the layout to Portrait mode
///
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown
]);
runApp(new MyApp());
}
答案 2 :(得分:1)
根据此doc,您可以使用Student data:
[student1]
id: 001
name:red
surname:brown
phone number:0123456
address: blabla
Id: 001
Name: red
Surname: brown
Phone: 0123456
Address: blabla
。
OrientationBuilder
答案 3 :(得分:0)
尽管乔纳(Jonah)的回答是正确的,但对我个人而言,我建议使用switch
而不是if
。
您需要在相关功能中实现不同的内容。
@override
Widget build(BuildContext context) {
switch (MediaQuery.of(context).orientation) {
case Orientation.landscape:
return _landscapeContent();
case Orientation.portrait:
default:
return _portraitContent();
}
}
更新
从另一面看,当您有一个内部布尔_fullscreen
标志来保持全屏状态时(假设您在某处有一个全屏按钮,并且即使手机处于纵向模式也要显示该内容) ,那么if
会更方便。
@override
Widget build(BuildContext context) {
final orientation = MediaQuery.of(context).orientation;
if (orientation == Orientation.landscape || _fullscreen) {
return _landscapeContent();
}
return _portraitContent();
}