在 window 底部放置水平滚动条

position horizontal scrollbar at bottom of window

我目前正在开发一个 Flutter 应用程序,我将屏幕分为两个区域。左侧区域约占屏幕宽度的 1/3,而右侧区域占屏幕宽度的另外 2/3。这是一个描述:

在“A”部分,我有一个基于 DataTable 的自定义“树视图”小部件。它允许用户 expand/collapse 部分树。树视图也可以在水平和垂直方向上滚动,以防它占用的屏幕空间超过区域 A 中的可用空间。

目前,如果树视图没有占用区域A的整个高度,那么树视图底部的水平滚动条只会出现在树视图的底部,如下图所示:

然而,这不是我想要放置水平滚动条的地方。我希望它位于 window 的底部,无论树视图小部件的大小如何,如下图所示:

我的widget树的代码如下:

    @override
    Widget build(BuildContext context) 
    {
        return Scaffold(
            appBar: AppBar(title: Text(widget.title, style: const TextStyle(color: Colors.white))),
            body: 
                Row(
                    children: [
                        Expanded(flex: 1, 
                            child: Align(
                                alignment: Alignment.topLeft,
                                child: Container(
                                    height: double.infinity,
                                    color: Colors.white,
                                    child: Scrollbar(
                                        scrollbarOrientation: ScrollbarOrientation.right,
                                        isAlwaysShown: false,
                                        child: SingleChildScrollView(
                                            scrollDirection: Axis.vertical,
                                            child: Scrollbar(
                                                isAlwaysShown: false,
                                                scrollbarOrientation: ScrollbarOrientation.bottom,
                                                child: SingleChildScrollView(
                                                    scrollDirection: Axis.horizontal,
                                                    child: TreeViewWidget(
                                                        model: model, 
                                                        dataheader_color: const Color.fromARGB(255, 230, 230, 230),
                                                        tree_expander_style: TreeExpanderStyle.PlusMinusOutlined,
                                                        show_header_row: true
                                                    ),
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        ),
                        Expanded(flex: 2, 
                            child: Column(
                                children: const [

                                ],
                            )
                        )
                    ]
                )
        );
    }

如何让水平滚动条正确地放置在 window 的底部,而不是紧挨着树视图小部件的下方?

感谢您的帮助!

如果您想同时支持水平和垂直滚动条,使用库可能是最简单的方法,例如 cross_scroll or adaptive_scrollbar,仅举几例。我建议您查看这些软件包或查找其他软件包,而不是自己编写。

如果你真的想自己做,你可以尝试将 Scrollbar 抬到你的 Container 之外,但一定要使用 ScrollController 连接他们。例如(根据您问题中的代码修改):

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _controller = ScrollController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('demo')),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Row(
          children: [
            Expanded(
              flex: 2,
              child: Scrollbar( // <-- move the scroll bar here
                controller: _controller, // <-- controller
                isAlwaysShown: true,
                scrollbarOrientation: ScrollbarOrientation.bottom,
                child: Container(
                  height: double.infinity,
                  color: Colors.yellow,
                  child: SingleChildScrollView(
                    controller: _controller, // <-- controller
                    scrollDirection: Axis.horizontal,
                    child: Scrollbar(
                      isAlwaysShown: true,
                      scrollbarOrientation: ScrollbarOrientation.right,
                      child: SingleChildScrollView(
                        scrollDirection: Axis.vertical,
                        child: Container(
                          color: Colors.blue,
                          width: 1000,
                          height: 300,
                        ),
                      ),
                    ),
                  ),
                ),
              ),
            ),
            Expanded(
              flex: 1,
              child: Container(
                color: Colors.red,
                child: FlutterLogo(),
              ),
            ),
          ],
        ),
      ),
    );
  }
}