如何使用按钮在小部件内滚动?

How to scroll withing a widget with a button?

我正在用 flutter 构建一个 WebApp,我有一个 SingleChildScrollView 里面有一些小部件。当我按下按钮时,我希望 appbar 上的按钮将我带到相应的小部件。 那可能吗?这里附上部分代码。

    Widget build(BuildContext context) {
        return Scaffold(
          extendBodyBehindAppBar: true,
          appBar: CustomAppBar(),
          backgroundColor: Colors.white,
          body: SingleChildScrollView(
            controller: widget.homeController,
            child: Column(
              children: [
                Inicio(),
                Services(),
                QuienesSomos(),
                ContactForm(),
                BottomInfo(),
              ],
            ),
          ),
        );
       }

所以我在 appbar 上每个 SingleChildScrollView 中的每个 children 都有一个按钮,我希望当我按下相应按钮时,它会向下滚动到相应部分在小部件上。我尝试使用 Navigator.of().PushNamed 但它会打开一个新屏幕而不是向下滚动。有任何想法吗?提前致谢!

要控制位置,您必须管理 SingleChildScrollView 的控制器。

如果你想顺利通过某个部分,你可以将控制 SingleChildScrollView 控制器的功能附加到按钮:

widget.homeController.animateTo(
  0.0, // change 0.0 {double offset} to corresponding widget position
  duration: Duration(seconds: 1),
  curve: Curves.easeOut,
);

如果你只是想瞬间跳到位置:

  widget.homeController.jumpTo(0.0); // change 0.0 {double value} to corresponding widget position

我可以通过使用来实现我的目标,

                onPressed: () {
                  Scrollable.ensureVisible(servicesKey.currentContext,
                      duration: Duration(seconds: 1),
                      curve: Curves.easeOut);
                },

并在每个小部件中分配相应的键。

制作滚动控制器:

  ScrollController myController = ScrollController();

并将其附加到您的 SingleChildScrollView 小部件:

  SingleChildScrollView(
     controller: myController,
     child: ...

现在创建一个 GlobalKey:

  final anchor = GlobalKey();

将它附加到您的任何小部件:

  Container(
    key: anchor,
    child: ...
  ),

就是这样,现在您可以使用滚动控制器以编程方式滚动到此小部件:

myController.position.ensureVisible(
   anchor.currentContext.findRenderObject(),
   alignment: 0.5,
   duration: const Duration(seconds: 1),
);