当前位置: 首页 > 知识库问答 >
问题:

在下一个屏幕的顶部放置一个小部件?

壤驷俊逸
2023-03-14

我有一个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...
                  ],
                ),
              )),
    );
  }
}

共有1个答案

苏乐
2023-03-14

如果要更改堆栈外小部件的位置,可以使用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有一个固定的位置。