当项目具有动态高度时,如何根据设备方向创建动态颤振网格布局
How do I create a dynamic flutter grid layout based on device orientation when the items have dynamic height
我正在尝试创建类似于 Android 在联系人应用程序中构建的布局,当创建新联系人(或为此编辑联系人)时,在纵向模式下整个视图是滚动的-能够以从上到下的布局将用户的头像放置在联系人表单的顶部,但是当您切换到横向模式时,布局会更改为并排布局,头像占据左半部分屏幕(全高且不可滚动)和右侧的联系表完全可滚动,独立于左侧的头像,保持固定。
我尝试使用 flutter_staggered_grid_view 库实现此功能,方法是根据设备方向在 StaggeredGridView.countBuilder
中设置 crossAxisCount
这样我就可以在只有 1 个设备之间切换项目在横轴上(在纵向模式下有垂直布局)到在横轴上有 2 个项目(在横向模式下有水平布局)。
不幸的是,即使每当我切换方向时 StaggeredGridView.countBuilder
嵌套在 OrientationBuilder
中,布局似乎也不会像 crossAxisCount
属性 那样更新不是动态的,一旦设置就无法更新。
body: OrientationBuilder(
builder: (context, or) {
int cac = (or == Orientation.portrait) ? 1 : 2;
return StaggeredGridView.countBuilder(
controller: _listViewScrollController,
itemBuilder: (BuildContext context, int index){
return _view[index];
},
itemCount: 2,
crossAxisCount: cac,
staggeredTileBuilder: (int index) {
return StaggeredTile.fit(cac);
},
scrollDirection: Axis.vertical,
);
},
)
网格有可能不是创建此类布局的正确方法,如果是这样的话,如果有人能指出正确的方向,我将不胜感激。
提前致谢。
我认为更好的方法是使用 Row
、Column
和 SingleChildScrollView
:
您可以尝试这样的操作:
Widget buildBody(BuildContext context) {
return OrientationBuilder(builder: (context, orientation) {
if (orientation == Orientation.portrait) {
return SingleChildScrollView(
child: Column(
children: <Widget>[
_buildAvatar(context, orientation),
_buildFields(context),
],
),
);
} else {
return Row(
children: <Widget>[
_buildAvatar(context, orientation),
Expanded(
child: SingleChildScrollView(
child: _buildFields(context),
),
),
],
);
}
});
}
Widget _buildAvatar(BuildContext context, Orientation orientation) {
return Container(
height: 300.0,
width: orientation == Orientation.landscape ? 300.0 : null,
color: Colors.blue,
child: Center(
child: CircleAvatar(
backgroundColor: Colors.white,
child: Text('RR'),
),
),
);
}
Widget _buildFields(BuildContext context) {
return Container(
height: 800.0,
color: Colors.white,
child: Center(
child: Container(
height: 250.0,
width: 250.0,
color: Colors.red,
),
),
);
}
buildBody
函数将创建上面的布局,您必须替换 _buildAvatar
和 _buildFields
的内容以满足您的需要。
我正在尝试创建类似于 Android 在联系人应用程序中构建的布局,当创建新联系人(或为此编辑联系人)时,在纵向模式下整个视图是滚动的-能够以从上到下的布局将用户的头像放置在联系人表单的顶部,但是当您切换到横向模式时,布局会更改为并排布局,头像占据左半部分屏幕(全高且不可滚动)和右侧的联系表完全可滚动,独立于左侧的头像,保持固定。
我尝试使用 flutter_staggered_grid_view 库实现此功能,方法是根据设备方向在 StaggeredGridView.countBuilder
中设置 crossAxisCount
这样我就可以在只有 1 个设备之间切换项目在横轴上(在纵向模式下有垂直布局)到在横轴上有 2 个项目(在横向模式下有水平布局)。
不幸的是,即使每当我切换方向时 StaggeredGridView.countBuilder
嵌套在 OrientationBuilder
中,布局似乎也不会像 crossAxisCount
属性 那样更新不是动态的,一旦设置就无法更新。
body: OrientationBuilder(
builder: (context, or) {
int cac = (or == Orientation.portrait) ? 1 : 2;
return StaggeredGridView.countBuilder(
controller: _listViewScrollController,
itemBuilder: (BuildContext context, int index){
return _view[index];
},
itemCount: 2,
crossAxisCount: cac,
staggeredTileBuilder: (int index) {
return StaggeredTile.fit(cac);
},
scrollDirection: Axis.vertical,
);
},
)
网格有可能不是创建此类布局的正确方法,如果是这样的话,如果有人能指出正确的方向,我将不胜感激。
提前致谢。
我认为更好的方法是使用 Row
、Column
和 SingleChildScrollView
:
您可以尝试这样的操作:
Widget buildBody(BuildContext context) {
return OrientationBuilder(builder: (context, orientation) {
if (orientation == Orientation.portrait) {
return SingleChildScrollView(
child: Column(
children: <Widget>[
_buildAvatar(context, orientation),
_buildFields(context),
],
),
);
} else {
return Row(
children: <Widget>[
_buildAvatar(context, orientation),
Expanded(
child: SingleChildScrollView(
child: _buildFields(context),
),
),
],
);
}
});
}
Widget _buildAvatar(BuildContext context, Orientation orientation) {
return Container(
height: 300.0,
width: orientation == Orientation.landscape ? 300.0 : null,
color: Colors.blue,
child: Center(
child: CircleAvatar(
backgroundColor: Colors.white,
child: Text('RR'),
),
),
);
}
Widget _buildFields(BuildContext context) {
return Container(
height: 800.0,
color: Colors.white,
child: Center(
child: Container(
height: 250.0,
width: 250.0,
color: Colors.red,
),
),
);
}
buildBody
函数将创建上面的布局,您必须替换 _buildAvatar
和 _buildFields
的内容以满足您的需要。