【问题标题】:Determine Scroll Widget height确定滚动小部件高度
【发布时间】:2020-01-05 19:33:51
【问题描述】:

我想确定“可滚动”小部件是否确实需要滚动。我最终想展示类似“Scroll for more”之类的东西。我如何做到这一点?

我可以使用 LayoutBuilder 和 ScrollController 的组合。但是,ScrollController 仅在任何事件发生后才给我 maxScrollExtent 和 minScrollExtent - 例如用户尝试滚动

我想在“构建”期间知道,以便我可以根据屏幕尺寸确定是否显示“滚动更多”

class _MyHomePageState extends State<MyHomePage> {
  int value = 0;
  String text = 'You have pushed the button 0 times\n';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              flex: 9,
              child: SingleChildScrollView(
                child: Text(text),
              ),
            ),
            Expanded(
              flex: 1,
                child: Text('Scroll for more')),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            value += 1;
            text = text + 'You have pushed the button $value times \n';
          });
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  }
}

我要动态显示

            Text('Scroll for more'),

在 SingleChildScrollView 需要滚动以查看整个内容时。请注意,我只是以上面的代码为例。

在我的真实案例中,我在 SingleChildScrollView 中有一个 StreamBuilder,我无法确定有多少数据将从流中流入。我也没有任何按钮或点击或任何手势来访问控制器和 setState

提前感谢您的帮助

【问题讨论】:

    标签: flutter scroll height


    【解决方案1】:
    class _MyHomePageState extends State<MyHomePage> {
      bool showMore = false;
      final scrollController = ScrollController();
    
      @override
      Widget build(BuildContext context) {
        SchedulerBinding.instance.addPostFrameCallback((_) {
          setState(() {
            showMore = scrollController.position.maxScrollExtent > 0;
          });
        });
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Expanded(
                  flex: 9,
                  child: SingleChildScrollView(
                    controller: scrollController,
                    child: SizedBox(height: 650, child: Text('blah')),
                  ),
                ),
                if (showMore) Expanded(flex: 1, child: Text('Scroll for more')),
              ],
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 非常感谢!这适用于示例。但是,正如我所提到的,我的真实情况是 StreamBuilder 返回滚动小部件。在这种情况下,我收到错误“颤动:ScrollController 未附加到任何滚动视图”。请在此处提供任何其他帮助
    • 你可能需要做一些组合: 1. 以上 2. 当你在流上获得更新时,检查是否有一个位置连接到控制器,如果是,那么更新“显示更多”小部件的状态
    • 太好了,我检查了控制器上的 hasClients,它不再给我一个错误。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 2021-11-25
    • 2019-06-03
    • 2019-05-23
    • 2015-03-21
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多