Flutter 响应式设计:如果屏幕更大,动态将 Column 更改为 Row

Posted

技术标签:

【中文标题】Flutter 响应式设计:如果屏幕更大,动态将 Column 更改为 Row【英文标题】:Flutter responsive design: Dynamically change Column to Row if the screen is larger 【发布时间】:2019-10-05 17:46:21 【问题描述】:

如果设备的屏幕宽度超过某个阈值,如何将 Column 小部件动态更改为 Row 小部件?

当用户在平板电脑或横向模式下使用应用程序时,布局应该不同,以优化可用宽度的使用。

在 CSS flexbox 中,就像将类从 flex-row 更改为 flex-column 一样简单,但在 Flutter 中,使用了小部件。

【问题讨论】:

【参考方案1】:

RowColumn 共享一个名为 Flex 的共同父级,该父级采用轴方向。只需更改direction 的值,您就可以将Flex 更改为一行或一列。

要获取屏幕宽度,您可以使用MediaQuery.of(context).size.width

您的小部件应如下所示:

@override
Widget build(BuildContext context) 
  bool isScreenWide = MediaQuery.of(context).size.width >= kMinWidthOfLargeScreen;

  return Scaffold(
    body: Flex(
      direction: isScreenWide ? Axis.horizontal : Axis.vertical,
      children: <Widget>[
        ...
      ],
    )
  );

【讨论】:

【参考方案2】:

要根据设备方向进行更改,您可以:

Orientation orientation = MediaQuery.of(context).orientation;

return orientation == Orientation.portrait
? Column(children: <Widget>[])
: Row(children: <Widget>[]);

我写了一个助手来做这个(列到行)。

import 'package:flutter/material.dart';

class OrientationSwitcher extends StatelessWidget 
  final List<Widget> children;

  const OrientationSwitcher(Key key, this.children) : super(key: key);

  @override
  Widget build(BuildContext context) 
    Orientation orientation = MediaQuery.of(context).orientation;
    return orientation == Orientation.portrait
    ? Column(children: children)
    : Row(children: children);
  

然后使用它...

  Widget build(BuildContext context) 
    return OrientationSwitcher(
      children: <Widget>[
           // place children here like its a column or row.
        ]
    )
  

您也可以使用 Flex() 或任何其他小部件来执行此操作。

此外,除了方向之外,还有更多可用选项,请务必查看 Flutter 文档中的 MediaQuery.of(context) 实现。

【讨论】:

以上是关于Flutter 响应式设计:如果屏幕更大,动态将 Column 更改为 Row的主要内容,如果未能解决你的问题,请参考以下文章

面试官:什么是响应式设计?响应式设计的基本原理是什么?如何做?

如何测试响应式网站设计跨浏览器兼容性?

媒体查询视口viewport和meta标签flex布局

如何制作响应式 svg -flutter

Flutter 应用开发之Bloc模式

响应式网页设计最佳实践