Flutter响应设计:如果屏幕较大,则动态将列更改为行

jc3wubiy  于 2023-02-25  发布在  Flutter
关注(0)|答案(3)|浏览(150)

如果设备的屏幕宽度超过某个阈值,如何动态地将列小部件更改为行小部件?
用例是当用户在平板电脑或横向模式下使用应用程序时,布局应有所不同,以优化可用宽度的使用。
在CSS flexbox中,将类从flex-row更改为flex-column非常简单,但在Flutter中,使用了小部件。

jfgube3f

jfgube3f1#

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>[
        ...
      ],
    )
  );
}
bjg7j2ky

bjg7j2ky2#

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

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(上下文)实现。

nue99wik

nue99wik3#

在宽屏幕上,我们显示一个等高的行,其中有3个小部件。在窄屏幕上,这三个小部件变成了一个全宽的列。

class CategorySelection extends StatelessWidget {
  const CategorySelection({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    double screenWidth = MediaQuery.of(context).size.width;
    double screenHeight = MediaQuery.of(context).size.height;
    bool isScreenWide = MediaQuery.of(context).size.width >= 1200;

    return MaxWidthContainer(
      child: isScreenWide? IntrinsicHeight(
        child:  Row(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: categoryList(isScreenWide,screenWidth,screenHeight),
        ),
      ): IntrinsicHeight(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: categoryList(isScreenWide,screenWidth,screenHeight),
        ),
      ),
    );
  }
}


List<Widget> categoryList(bool isScreenWide,double screenWidth,double screenHeight){
 return [
   const Widget1(),
   isScreenWide? SizedBox(width: screenWidth * 0.03):SizedBox(height: screenHeight * 0.03),
   const Widget1(),
   isScreenWide? SizedBox(width: screenWidth * 0.03):SizedBox(height: screenHeight * 0.03),
   const Widget1(),
 ];
}

相关问题