Flutter 颤振-如何检查SingleChildScrollView是否适合屏幕

Flutter 颤振-如何检查SingleChildScrollView是否适合屏幕,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,是否可以检查SingleChildScrollView是否适合屏幕,从而不需要滚动 我希望根据这些信息实现不同的行为 提前感谢大家。我也遇到了同样的问题,并找到了解决办法。我是这样做的: 理论: 您需要为您的SingleChildScrollView提供一个 原因是“[…]scroll controller创建一个用于管理特定于单个可滚动小部件的状态的控件”,我们将使用它来确定可滚动小部件的内容是否适合屏幕 我们感兴趣的属性是maxScrollExtent。它属于滚动位置,指示我们可以滚动到的“

是否可以检查SingleChildScrollView是否适合屏幕,从而不需要滚动

我希望根据这些信息实现不同的行为


提前感谢大家。

我也遇到了同样的问题,并找到了解决办法。我是这样做的:

理论: 您需要为您的
SingleChildScrollView
提供一个

原因是“[…]scroll controller创建一个用于管理特定于单个可滚动小部件的状态的控件”,我们将使用它来确定可滚动小部件的内容是否适合屏幕

我们感兴趣的属性是
maxScrollExtent
。它属于
滚动位置
,指示我们可以滚动到的“像素范围内的最大值”

怎样: 我使用它的方式是检查该值是否大于零:

  • 如果是,则内容不符合给定高度
  • 否则,如果等于零,则可滚动内容适合屏幕
使用此方法的注意事项: 孩子的大小是构建的反射,因此您无法提前知道它是否可以滚动。但是我们可以做的是在构建之后添加一个要执行的。此时,当运行此回调时,构建已经发生,因此我们可以检查子项是否适合屏幕

问题是,我们需要一个
StatefulWidget
来实现这一点。在这种情况下,我们可以在
initState()
override(在小部件的生命周期中只运行一次)中,或者在
didChangeDependencies()
中安排帧后回调,该回调在小部件因依赖项更改而需要重建时运行。看看什么最适合你的目的

TL;博士: 下面的示例演示了如何利用
maxScrollExtent
。尝试在中运行并更改预览的宽度:

导入“包装:颤振/材料.省道”;
最终颜色深蓝色=颜色。来自argb(255,18,32,47);
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark().copyWith(脚手架背景颜色:深蓝色),
debugShowCheckedModeBanner:false,
家:脚手架(
正文:中(
子项:MyWidget(),
),
),
);
}
}
//这是一个重要的小部件
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
最终ScrollController_controller=ScrollController();
@凌驾
void didChangeDependencies(){
super.didChangeDependencies();
WidgetsBinding.instance.addPostFrameCallback((){
//检查以查看控制器的[ScrollMetrics]maxScrollExtent。
//如果为零,则整个可滚动页面将适合屏幕的视口。
//因此,触发fadeoutController.reverse()以使滚动条消失。
var maxScrollExtent=\u controller.position.maxScrollExtent;
如果(maxScrollExtent==0){
打印(“完全适合”);
}否则{
打印(“需要滚动”);
}
});
}
@凌驾
小部件构建(构建上下文){
返回SingleChildScrollView(
控制器:_控制器,
子:列(
儿童:[
容器(
宽度:MediaQuery.of(context).size.width,
子:文本(_Text),
),
],
),
);
}
}
//非常非常长的lorem ipsum,如果不合适,我们可以滚动。
const String _text=''Lorem ipsum door sit amet,concetetur adipsicing elite。埃蒂亚姆·森佩尔(Etiam semper)、马萨·ac·德高望重元素(massa ac Dignessim elementum)、智者尼布·福西布斯·尼布(sapien nibh faucibus nibh)、发酵液(vel fermentum justo augue non est)。在直径为orci hendrerit pellentesque vitae et tortor的前庭。同侧额额内翻。Morbi eleifend dolor eget risus Dignessim Temporal。库拉比托·苏西皮特·厄罗斯·图皮斯(Curabitur suscipit eros turpis),身份是iaculis odio fringilla nec。第二阶段是在欧洲。埃尼安·康瓦利斯·尤伊斯莫·佩伦茨克。Integer congue libero turpis dapibus,vitae调味品ex elementum。纳拉姆调味品,turpis eget tincidunt ultrices,orci mi maximus ex,坐在我的自由时间。这是一个巨大的元素,是一个巨大的元素。贝内纳蒂斯精英酒店的阿利奎姆·弗里利亚玉米饼。在日常生活中,我们坐在一个巨大的角落里。Nam sit amet ullamcorper酒后驾车。在乌尔纳,你可以坐在那里,享受自由。
在洛勒姆麦格纳举行了一次会议。乌拉姆科珀·康瓦利斯贵宾。努克·奥纳雷、乌纳·埃吉特·索达莱斯·费吉亚、塞姆·奥迪奥·埃利芬德·费利斯,一位温文尔雅的奥勒姆·米塞德·奥奇。无便利。佩伦茨克是我的权杖,索利西图丁·努克·农,乌兰科佩尔·内克。大魁北克、拉西尼亚、临时维韦拉。无需经过适当的处理。莫比ultricies dapibus scelerisque。佩伦茨克和精英胡斯托。Phasellus eget tempus massa。库拉比图尔(Curabitur id enim mollis),芸香(rutrum lorem in),阿利奎特(aliquet)直径。产于蒙特斯的天然对虾和马格纳斯虎鲸(Orci varius natoque penatibus et magnis),以及印度虎鲸(nascetur ridiculus mus)。普罗因·森佩尔·尤里西斯·奥奇。临时发酵剂,地点:Arcuullamcorper。克拉斯·埃利芬德·埃拉特·孕产妇,马蒂斯·多洛·欧,莫利斯·洛雷姆。Donec eu aliquet mauris,一个埃吉斯塔侵权人。
祝你幸福。Phasellus调味品quam quam,semper mattis odio dapibus vitae。不属于封建元素。草菇。这是一种设施。莫里斯·诺亨德雷特·莱克图斯。Donec mollis ante non viverra euismod。无缘,无缘,无缘,无缘,无缘。红润的阿利奎姆,美丽的莫里斯,美丽的康瓦利斯,美丽的奥库,高贵的泰勒斯,美丽的多洛。这是一句名言