- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 2 个嵌套的可滚动列表来实现 DraggableScrollableSheet。
我不能使用开箱即用的 NestedScrollView 类(我已经尝试过了,但我无法让它工作,因为它似乎是为一个前面的标题条和只有一个可滚动列表制作的)。
我使用 CustomScrollView 类的方法通常似乎有效,但不幸的是它带来了另一个问题:
每次用户拖动工作表时,每帧都重建所有条子 .这是非常缓慢的。
我打开了一个简单的测试用例来排除它不是任何复杂小部件-/提供者-/消费者-等逻辑的错误。
即使使用这些简单的小部件,所有条子每帧都会重建一次......
这是框架中的错误还是我在这里做错了什么?
非常感谢你...
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: DraggableScrollableActuator(child: MyHomePage(title: 'Flutter Demo Home Page')),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
AnimationController _controller;
Tween<Offset> _tween = Tween(begin: Offset(0, 1), end: Offset(0, 0));
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: Duration(milliseconds: 300));
}
@override
void dispose() {
super.dispose();
_controller.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(children: [
SlideTransition(
position: _tween.animate(_controller),
child: MyPopUpSheet(),
),
Center(
child: IconButton(
icon: const Icon(Icons.info),
onPressed: () {
setState(() {
if (_controller.isDismissed)
_controller.forward();
else if (_controller.isCompleted) _controller.reverse().then((value) => _controller.reset());
});
}),
),
]));
}
}
class MyPopUpSheet extends StatelessWidget {
ScrollController _scrollController; //Needed for
@override
Widget build(BuildContext context) {
print("MyPopUpSheet.build()");
return Material(
elevation: 4,
shadowColor: Colors.orange,
child: DraggableScrollableSheet(
expand: true,
initialChildSize: 0.4,
minChildSize: 0.4,
maxChildSize: 1.0,
builder: (ctx, scrollController) {
_scrollController = scrollController;
return CustomScrollView(
shrinkWrap: true,
controller: _scrollController,
slivers: [
SliverToBoxAdapter(child: Test(Colors.deepOrange)),
SliverToBoxAdapter(child: Test(Colors.red)),
SliverToBoxAdapter(child: Test(Colors.green)),
SliverToBoxAdapter(child: Test(Colors.purpleAccent)),
SliverToBoxAdapter(child: Test(Colors.amberAccent))
],
);
},
),
);
}
}
class Test extends StatelessWidget {
final Color color;
Test(this.color);
@override
Widget build(BuildContext context) {
print("Test.build()");
return Container(height: 100, color: color);
}
}
最佳答案
我遇到了同样的问题,并找到了一种解决方法,它不会停止重建,但会缓存子项并修复滚动卡顿。有效的是,将小部件存储在构建器中的变量中并从构建器返回该变量。
一般修复
var child;
return DraggableScrollableSheet(
expand: true,
initialChildSize: 0.4,
minChildSize: 0.4,
maxChildSize: 1.0,
builder: (ctx, scrollController) {
if(child == null) {
child = SomeWidget();
}
return child;
}
);
修复特定于此问题
var child;
return DraggableScrollableSheet(
expand: true,
initialChildSize: 0.4,
minChildSize: 0.4,
maxChildSize: 1.0,
builder: (ctx, scrollController) {
if(child == null) {
child = CustomScrollView(
shrinkWrap: true,
controller: _scrollController,
slivers: [
SliverToBoxAdapter(child: Test(Colors.deepOrange)),
SliverToBoxAdapter(child: Test(Colors.red)),
SliverToBoxAdapter(child: Test(Colors.green)),
SliverToBoxAdapter(child: Test(Colors.purpleAccent)),
SliverToBoxAdapter(child: Test(Colors.amberAccent))
],
);
}
return child;
}
);
关于flutter - DraggableScrollableSheet 在拖动时每帧重建所有子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64101774/
我正在尝试使用 2 个嵌套的可滚动列表来实现 DraggableScrollableSheet。 我不能使用开箱即用的 NestedScrollView 类(我已经尝试过了,但我无法让它工作,因为
寻求有关可拖动可滚动工作表的帮助。 Atm 如果你向上轻弹工作表,滚动会立即激活,如果你用力轻弹,列表会滚动直到动力停止。但我想要的是一个示例,其中当您向上轻弹时列表不会滚动并且工作表只是捕捉到顶部,
在 flutter 中,我们有一个小部件 DraggableScrollableSheet .现在我想要 child 在拖动时的当前位置或当前大小。目前无法获得该值。它在其 builder 方法中提供
点击后,我执行以下功能,该功能应该使 Bottom Sheet 以通常的方式出现(从底部向上滚动): showModalBottomSheet( context: context,
我想在我的应用程序上使用 DraggableScrollableSheet 小部件,当我像下面的代码一样使用它时,可以毫无问题地显示: class HomePage extends Stateless
我想在按下某个按钮时更改 DraggableScrollableSheet 的高度。到目前为止,这就是我所拥有的 ..other code up here... double _sheetSize
我正在我的 flutter 应用程序中实现 DraggableScrollableSheet 并希望有一个粘性标题,即只有 ListView 滚动并且工作表的顶部始终保持原位。 我的小部件如下所示:
在下面的代码中,我想动画化更改 DraggableScrollableSheet 边框半径,然后实现粘在屏幕顶部,例如 AppBar,为此实现了动画更改边框半径,但它不起作用,我收到此错误: 错误:
当我使用 DraggableScrollableSheet 时,我遇到了一些问题,它们是: 拖到底部后如何设置最小高度 如何设置最小高度 如何设置最大高度 我怎么知道像坚持 appBar 一样坚持到顶
在我的应用程序中有一个 DraggableScrollableSheet 和一个 FAB。如果展开 DraggableScrollableSheet,我希望 FAB 不可见。我需要检查扩展事件 我尝试
我想知道是否有人知道/找到了以编程方式使 Flutter 的 DraggableScrollableSheet 展开/折叠的方法。我正在使用他们 Dev channel 的 Flutter 最新版本,
当我按下特定按钮并使用 DraggableScrollableSheet 时,我尝试制作一个弹出式卡片,因为我希望它开始最小化,然后用户可以将其向上拖动以最大化它。所以问题是有什么方法可以在用户按下后
将 SliverAppBar 添加到 DraggableScrollableSheet 后,我无法将工作表向上或向下滚动到屏幕,但 SliverAppbar 内的列表工作正常, 完整源代码: impo
我想阻止我的 DraggableScrollableSheet 内部滚动,同时仍然能够上下拖动它。有没有办法做到这一点?我使用过bottomSheet,但无法上下拖动它们。 我想远离第三方代码,所以如
我正在研究您可以在下面的屏幕截图中看到的概念: design concept 注意:箭头不是 UI 的一部分,而是添加来演示可拖动功能。 屏幕有一个显示位置标题的 SliverAppBar,包含位置描
我是 flutter 新手。我正在尝试添加一个小 handle 来提示用户像谷歌地图一样拖动。但是,如果我在上面放置一个单独的容器来显示为 handle ,则当用户触摸它时将不会有拖动效果。我明白这是
我是一名优秀的程序员,十分优秀!