如果设备的屏幕宽度超过某个阈值,如何动态地将列小部件更改为行小部件?用例是当用户在平板电脑或横向模式下使用应用程序时,布局应有所不同,以优化可用宽度的使用。在CSS flexbox中,将类从flex-row更改为flex-column非常简单,但在Flutter中,使用了小部件。
jfgube3f1#
Row和Column共享一个称为Flex的公共父项,该父项采用轴方向。只需更改direction的值,即可将Flex更改为行或列。要获得屏幕宽度,可以使用MediaQuery.of(context).size.width。您的小部件应如下所示:
Row
Column
Flex
direction
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>[ ... ], ) ); }
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(上下文)实现。
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(), ]; }
3条答案
按热度按时间jfgube3f1#
Row
和Column
共享一个称为Flex
的公共父项,该父项采用轴方向。只需更改direction
的值,即可将Flex
更改为行或列。要获得屏幕宽度,可以使用
MediaQuery.of(context).size.width
。您的小部件应如下所示:
bjg7j2ky2#
要根据设备方向进行更改,您可以执行以下操作:
我写了一个助手来完成这个任务(从列到行)。
为了使用它...
您也可以使用Flex()或任何其他小部件来完成此操作。
此外,除了方向之外,还有更多的选项可用,请务必查看Flutter文档上的MediaQuery.of(上下文)实现。
nue99wik3#
在宽屏幕上,我们显示一个等高的行,其中有3个小部件。在窄屏幕上,这三个小部件变成了一个全宽的列。