【问题标题】:Always show scrollbar - Flutter始终显示滚动条 - Flutter
【发布时间】:2019-03-02 21:40:14
【问题描述】:

我的文字很长,需要在用户进入我的页面时默认显示滚动条。

目前,在用户单击文本之前不会显示条形图,这是不好的行为,因为用户可能会在没有注意到有一些未读文本的情况下离开页面。

我的代码:

    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(15.0),
        child: Center(
          child: Column(
            children: <Widget>[
              Image.asset(
                "assets/images/logo.png",
                height: 200.0,
              ),
              SizedBox(
                height: 40,
              ),
              Expanded(
                child: Scrollbar(
                  child: SingleChildScrollView(
                    child: Text("Long Text Here ...",
                      textDirection: TextDirection.rtl,
                      style: TextStyle(fontSize: 17.2),
                    ),
                  ),
                ),
              ),
              SizedBox(
                height: 50,
              ),
              Row(
                children: <Widget>[
                  Expanded(
                    child: RaisedButton(
                      child: Text("Continue"),
                      onPressed: () {
                        MaterialPageRoute route = MaterialPageRoute(
                            builder: (BuildContext context) => MainPage());
                        Navigator.of(context).push(route);
                      },
                    ),
                  ),
                  SizedBox(
                    width: 20.0,
                  ),
                  RaisedButton(
                    child: Text("Close"),
                    onPressed: () {
                      exit(0);
                    },
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }```

【问题讨论】:

标签: text layout dart flutter


【解决方案1】:

从 Flutter 1.17 版开始,在 Scrollbar 上,您可以将 isAlwaysShown 设置为 true,但您必须为 ScrollbarSingleChildScrollView 设置相同的 controller(这适用于任何其他可滚动的小部件)。

请记住,要使Scrollbar 可见,必须有足够的项目可以滚动。如果没有,Scrollbar 将不会显示。

完整的工作示例:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: MyWidget(),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {  
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final _scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(15.0),
        child: Center(
          child: Column(
            children: <Widget>[
              // ...
              Expanded(
                child: Scrollbar(
                  controller: _scrollController, // <---- Here, the controller
                  isAlwaysShown: true, // <---- Required
                  child: SingleChildScrollView(
                    controller: _scrollController, // <---- Same as the Scrollbar controller
                    child: Text(
                      "Long Text Here ...",
                      textDirection: TextDirection.rtl,
                      style: TextStyle(fontSize: 17.2),
                    ),
                  ),
                ),
              ),
              // ...
            ],
          ),
        ),
      ),
    );
  }
}

【讨论】:

  • 滚动条在我开始移动之前不会显示。有没有办法让滚动条始终显示
  • 检查您是否为滚动条和可滚动小部件定义了相同的控制器,以及您是否在滚动条中将isAlwaysShown 设置为true
  • 有效,当我将控制器添加到滚动条和 SingleChildScrollView 时,滚动条变得可见
  • @joaomarcos96 我想得越多,我认为这与我的对话框不是一个完整的有状态小部件有关。除非我弹出并重新进入对话框,否则不会显示此类更改。我希望有一种简单的方法来进行对话框更新。 :(。再次感谢分享这个方法,它真的在我的应用程序的所有其他地方帮助了我!喜欢它
  • 对我来说它会显示,但我无法抓住它,即使分配了控制器。在 ScrollBar 上设置 interactive: true, 可以解决这个问题。
【解决方案2】:

使用draggable_scrollbar 包。它提供了一个可拖动的滚动条,带有使滚动条始终可见的选项。比如可以使用下面的代码

 DraggableScrollbar.arrows(
  alwaysVisibleScrollThumb: true, //use this to make scroll thumb always visible
  labelTextBuilder: (double offset) => Text("${offset ~/ 100}"),
  controller: myScrollController,
  child: ListView.builder(
    controller: myScrollController,
    itemCount: 1000,
    itemExtent: 100.0,
    itemBuilder: (context, index) {
      return Container(
        padding: EdgeInsets.all(8.0),
        child: Material(
          elevation: 4.0,
          borderRadius: BorderRadius.circular(4.0),
          color: Colors.purple[index % 9 * 100],
          child: Center(
            child: Text(index.toString()),
          ),
        ),
      );
    },
  ),
);

【讨论】:

  • 不使用插件有什么解决办法吗?为什么他们没有像 isScrollbarAlwaysVisible 这样添加 1 个参数。
  • flutter repo 上有未解决的问题和拉取请求,但他们还没有实现。如果您不想使用插件,请查看此 gits,这将创建一个自定义滚动视图小部件,滚动条始终可见,并允许自定义滚动条 gist.github.com/slightfoot/beb74749bf2e743a6da294b37a7dcf8d
【解决方案3】:

从 v2.9.0-1.0 开始,thumbVisiblity 是要设置的正确字段。

请注意,您可以使用 ScrollbarTheme 为您的应用(或某个子树)全局设置此设置:

    return MaterialApp(
    ...
      theme: ThemeData(
        ...
        scrollbarTheme: ScrollbarThemeData(
          thumbVisibility: MaterialStateProperty.all<bool>(true),
        )
      )
    )

这样的样式最好选择主题,所以避免做多次。

您仍然需要添加滚动条和控制器,如其他答案中所述。

【讨论】:

    【解决方案4】:

    您可以更改滚动条主题以设置标志 isAlwaysShown true

    scrollbarTheme: const ScrollbarThemeData(isAlwaysShown: true)

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多