Flutter如何处理方向变化

时间:2018-04-05 03:05:30

标签: flutter

方向更改处理是否与使用Flutter中的更新维度重新运行小部件的构建一样简单?

我问,因为在Android中,重建了整个Activity,这就是为什么所有信息都是通过意图发送的。

在设计小部件时要记住任何问题,以便他们处理方向更改或其他导致UI更改的更改?

4 个答案:

答案 0 :(得分:7)

基本上 - 是的!现在,更具体地说,MediaQuery小部件侦听方向/大小/布局更改并重建它的子级。此小部件已经是MaterialAppWidgetsApp小部件的一部分,因此您可能不需要包含它。

如果您希望小部件利用设备方向,可以使用MediaQuery.of静态成员访问包含设备方向的MediaQueryData。例如,一个简单的小部件,以纵向和横向显示不同的文本(需要是MaterialAppWidgetsAppMediaQuery的孩子。

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();
}