我有一个SingleChildScrollView,它有一个包含许多子项的列小部件。我希望将一组按钮“放在下一个屏幕上”(例如“PageBreak小部件”)。
我已经尝试过了,但是它产生了一个异常,因为您只应该使用一个定位小部件和一个堆栈小部件(而不是列小部件):
if (btnset is Spacer)
Positioned(
top: height,
child: SizedBox(
key: GlobalKey(
debugLabel: "NEXTSCREEN",
),
height: height / 2))
return Scaffold(
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(height: 80),
if (_scrollController.hasClients && _scrollController.offset > 0)
FloatingActionButton(
backgroundColor: Colors.white,
foregroundColor: Colors.blue,
child: Icon(Icons.arrow_upward),
mini: true,
heroTag: null,
onPressed: () {
if (_scrollController.hasClients)
_scrollController.animateTo(
_scrollController.offset -
_scrollController.position.viewportDimension,
duration: Duration(milliseconds: 500),
curve: Curves.ease);
}),
Spacer(),
if (_scrollController.hasClients &&
_scrollController.offset <
_scrollController.position.maxScrollExtent)
FloatingActionButton(
backgroundColor: Colors.white,
foregroundColor: Colors.blue,
mini: true,
heroTag: null,
child: Icon(Icons.arrow_downward),
onPressed: () {
if (_scrollController.hasClients)
_scrollController.animateTo(
_scrollController.offset +
_scrollController.position.viewportDimension,
duration: Duration(milliseconds: 500),
curve: Curves.ease);
}),
]),
appBar: AppBar(
title: Text(meshTag +
data['Name']
.strval() /*+
" " +
StatusWord(data['Alarms'].val).toString()*/
),
actions: [
StatusWordWidget(
data['Alarms'].val,
short: true,
direction: Axis.horizontal,
),
]),
//drawer: Drawer(), //You do this, the back arrow goes away...
body: !initialized
? Center(
child:
CircularProgressIndicator()) //Circle of Death while we connect
: Scrollbar(
thickness: 8.0,
isAlwaysShown: true,
child: SingleChildScrollView(
controller: _scrollController,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
verticalDirection: VerticalDirection.down,
children: <Widget>[
Container(
margin: EdgeInsets.fromLTRB(
0, 0, 10, 2), //Make room for scroll bar!
child: headerRow()),
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
RotatedBox(
quarterTurns: -1,
child: ConstrainedBox(
constraints: BoxConstraints.tightFor(
height: 50, width: chartHeight),
child: Center(
child: SliderTheme(
data: SliderThemeData(
trackShape: CustomTrackShape()),
child: Slider(
value: localset * 1.0,
max: maxy,
min: miny,
onChanged: (double value) {
setState(() {
localset = value.toInt();
});
}))))),
Expanded(child: chartwidget)
]),
if (localset != data['Setpoint'].val)
ElevatedButton(
child: Text('Set Setpoint to: ' + localset.toString()),
onPressed: (localset == data['Setpoint'].val)
? null
: () {
//Write Value to Ble.
setState(() {
data['Setpoint'].val = localset;
data['Setpoint'].bttx();
});
},
),
Divider(),
for (var btnset in mainButtons) ...[
if (btnset is Spacer)
SizedBox(
key: GlobalKey(
debugLabel: "NEXTSCREEN",
),
height: height / 3)
else ...[btnset, Divider()]
],
Divider(),
GestureDetector(
child: Divider(
thickness: 8,
),
onLongPress: () {
showdev = true;
},
),
if (showdev) ...{
ElevatedButton(
onPressed: () {
//Load the log
loadlogtext();
},
child: Text("Read")),
ConstrainedBox(
constraints: BoxConstraints(minWidth: 300),
child: Text(logtext)),
Divider(),
//ToDo: A debug datatable with all vars.
DataTable(
showCheckboxColumn: false,
columns: [
DataColumn(
label: Text("Name"),
numeric: false,
tooltip: "Name of parameter",
),
DataColumn(
label: Expanded(child: Text("Value")),
numeric: true,
tooltip: "Signal Strength",
),
],
rows: DeviceData.entries
.map(
(item) => DataRow(
onSelectChanged: (bool? selected) {
print('Picked ${item.name}');
},
cells: [
DataCell(Container(
//width: 120,
child: Text(item.name),
)),
DataCell(
Container(
width: 40,
child: Text((item.isnum
? item.val.toString()
: item.str == null
? "<null>"
: item.str)!)),
),
]),
)
.toList(),
),
Divider()
},
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: EdgeInsets.all(20.0),
child: OutlinedButton(
child: Text('Back'),
onPressed: () {
Navigator.pop(context);
},
),
),
],
),
ConstrainedBox(
constraints: BoxConstraints(
minHeight: 40)) //Keep the button off the bottom...
],
),
)),
);
}
}
如果要更改堆栈外小部件的位置,可以使用transform.translate()
。然而,对于您的情况,这并不是最理想的解决方案。
由于使用的是脚手架,所以可以将appbar
设置为具有appbar()
的列,然后将小部件保留在屏幕上,或者将小部件放在bottomnavigationbar()
中。也可以使用customscrollview()
,因为您可以使用滚动应用程序条,它在您滚动页面时会发生变化(详细信息请参阅https://api.flutter.dev/flutter/widgets/customscrollview-class.html),或者nestedscrollview()
,如果您觉得它更适合您的需要(详细信息请参阅https://api.flutter.dev/flutter/widgets/nestedscrollview-class.html)。
使用transform.translate()
小部件对于您正在做的事情几乎从来都不是一个好的选择,因为它更难实现,并且将在更小的屏幕上工作。它也是“重新发明轮子”,因为Flutter已经提供了很多有用的方法来实现这一点,所以我建议你看看上面的小部件,并尝试找到一个最适合你的需要。
我想在我的JPanel上放置两个按钮,其中一个位于中心,另一个位于JPanel的右上角。JPanel与包含JPanel的JFrame大小相同。如何使用GridBagLayout和GridBagConstraints实现这一点? 用于camickr的MCVE 固定溶胶: 固定文本框的图像
链接到网站: 网站 navbar链接在较小屏幕上折叠成一个汉堡菜单下拉菜单,我为顶部边框创建了一个CSS属性,应用于navbar。现在,当屏幕变小,汉堡菜单按钮似乎是重叠的绿色边框-顶部的navbar! 也许这是一个初学者的问题,但我尝试了我所能想到的一切:边距将按钮移低一点(现在它也与底部边框重叠),移除背景颜色或使用使其透明(似乎根本不起作用)... 非常感谢任何建议... 下面是它的样子:
我有一行有X个可能的列。 现在我想将添加到所有小屏幕列和大屏幕列的相同边距,如果有超过4行,则会显示两个“行”,因此需要一些间距。 仅使用CSS就可以做到这一点吗?
问题内容: 我有一个div,当我的页面首次加载时,它离顶部约100像素(该页面包含一些按钮等)。 当用户滚动通过它时,我希望div“关注”该用户,因为它附着在屏幕顶部。当用户返回页面顶部时,我希望它返回到其原始位置。 问题答案: 诀窍是您必须将其设置为position:fixed,但仅在用户滚动经过它之后才能设置。 可以通过将处理程序附加到window.scroll事件来完成此操作 当页面滚动经过
这可能是我处理布局的方式有问题。对Java和Android软件开发工具包来说有点新鲜。我正在使用Android Studio。 我在这一点上的目标是有一个应用程序,屏幕底部显示一个带有图标的导航栏,顶部有一个带有“关闭”按钮和“保存”按钮的工具栏。工具栏和导航栏之间应该是一个空白的白色屏幕。 但是我很难让工具栏停留在屏幕的顶部。灰色背景占据了白色背景前面的整个屏幕。下面是截图。 这是我所知道的:
在positon=fixed的div上,我似乎无法滚动页面。 当我使用下面的代码时: 在overlay(类名)div中,它不起作用,因为overlay div有一个固定的位置。