Flutter / ListView 和 StreamBuilder:过度滚动时显示错误
Flutter / ListView and StreamBuilder : bug display when overscrolled
当我过度滚动我的 ListView 时出现显示问题(有点“振动”,见下文):
overscroll display issue
我没有收到任何错误消息,我也不知道这个问题是从哪里来的。
你知道如何解决这个问题吗?我应该找到避免过度滚动的方法吗?
谢谢!
这是我的代码:
Widget build(BuildContext context) {
TextEditingController controller = TextEditingController();
return Scaffold(
backgroundColor: base,
body: SafeArea(
bottom: false,
child: Column(
children: <Widget>[
Expanded(child: InkWell(child: DetailPage(post, user, scrollController), onTap: (){
FocusScope.of(context).requestFocus(FocusNode());
})),
Container(width: MediaQuery.of(context).size.width, height: 1.0, color: baseAccent,),
Container(width: MediaQuery.of(context).size.width, height: 75.0, color: white,
padding: EdgeInsets.only(left: 10.0, right: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(width: MediaQuery.of(context).size.width - 100,
child: MyTextField(controller: controller, hint: "Écrivez un commentaire"),
),
IconButton(icon: SendIcon, onPressed: (){
FocusScope.of(context).requestFocus(FocusNode());
if(controller.text != null && controller.text != ""){
FireHelper().addComment(post, controller.text, post.userId);
scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: 300), curve: Curves.ease);
}
})
],
),
)
],
)
),
);
}
这是 DetailPage 代码(问题一定出自此处):
Widget build(BuildContext context) {
if(currentPost!=null){
return ListView.builder(
controller: widget.scrollController,
itemCount: currentPost.comments.length + 1,
itemBuilder: (BuildContext ctx, int index) {
if (index == 0) {
if(widget.post.type=="Movie"){
return MovieTile(post: currentPost, user: widget.user, detail: true);
} else {
if(widget.post.type=="Serie"){
return SerieTile(post: currentPost, user: widget.user, detail: true);
} else {
if(widget.post.type=="Book"){
return BookTile(post: currentPost, user: widget.user, detail: true);
} else {
return PostTile(post: currentPost, user: widget.user, detail: true);
}
}
}
}
else {
Comment comment = Comment(currentPost.comments[index - 1]);
if(me.uid == comment.userId){
streamUsers(comment.userId);
return StreamBuilder(
stream: FireHelper().fire_user.doc(comment.userId).snapshots(),
builder: (BuildContext ctx, AsyncSnapshot<DocumentSnapshot> snap){
if(snap.hasData) {
user = myUser(snap.data);
return OnSlide(
items: <ActionItems>[
new ActionItems(
icon: IconButton(
icon: Icon(Icons.delete),
onPressed: () {},
color: Colors.red),
onPress: () =>
({
FireHelper().deleteComment(currentPost.ref, user.uid, comment.text, comment.date),
comments.remove(comment),
print("comment deleted."),
}),
backgroudColor: Colors
.transparent)
],
child: CommentTile(comment, user)
);
} else {
return LoadingCenter();
}
});
}
else {
return StreamBuilder(
stream: FireHelper().fire_user.doc(comment.userId).snapshots(),
builder: (BuildContext ctx, AsyncSnapshot<DocumentSnapshot> snap){
if(snap.hasData) {
user = myUser(snap.data);
return CommentTile(comment, user);
} else {
return LoadingCenter();
}
}
);
}
}
});
} else {
return LoadingCenter();
};
}
你可以试试玩卷轴物理。在您的 ListView
下添加:
physics: ClampingScrollPhysics()
有很多卷轴物理选项:
Flutter ListView and ScrollPhysics: A Detailed Look
当我过度滚动我的 ListView 时出现显示问题(有点“振动”,见下文):
overscroll display issue
我没有收到任何错误消息,我也不知道这个问题是从哪里来的。
你知道如何解决这个问题吗?我应该找到避免过度滚动的方法吗?
谢谢!
这是我的代码:
Widget build(BuildContext context) {
TextEditingController controller = TextEditingController();
return Scaffold(
backgroundColor: base,
body: SafeArea(
bottom: false,
child: Column(
children: <Widget>[
Expanded(child: InkWell(child: DetailPage(post, user, scrollController), onTap: (){
FocusScope.of(context).requestFocus(FocusNode());
})),
Container(width: MediaQuery.of(context).size.width, height: 1.0, color: baseAccent,),
Container(width: MediaQuery.of(context).size.width, height: 75.0, color: white,
padding: EdgeInsets.only(left: 10.0, right: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(width: MediaQuery.of(context).size.width - 100,
child: MyTextField(controller: controller, hint: "Écrivez un commentaire"),
),
IconButton(icon: SendIcon, onPressed: (){
FocusScope.of(context).requestFocus(FocusNode());
if(controller.text != null && controller.text != ""){
FireHelper().addComment(post, controller.text, post.userId);
scrollController.animateTo(scrollController.position.maxScrollExtent, duration: Duration(milliseconds: 300), curve: Curves.ease);
}
})
],
),
)
],
)
),
);
}
这是 DetailPage 代码(问题一定出自此处):
Widget build(BuildContext context) {
if(currentPost!=null){
return ListView.builder(
controller: widget.scrollController,
itemCount: currentPost.comments.length + 1,
itemBuilder: (BuildContext ctx, int index) {
if (index == 0) {
if(widget.post.type=="Movie"){
return MovieTile(post: currentPost, user: widget.user, detail: true);
} else {
if(widget.post.type=="Serie"){
return SerieTile(post: currentPost, user: widget.user, detail: true);
} else {
if(widget.post.type=="Book"){
return BookTile(post: currentPost, user: widget.user, detail: true);
} else {
return PostTile(post: currentPost, user: widget.user, detail: true);
}
}
}
}
else {
Comment comment = Comment(currentPost.comments[index - 1]);
if(me.uid == comment.userId){
streamUsers(comment.userId);
return StreamBuilder(
stream: FireHelper().fire_user.doc(comment.userId).snapshots(),
builder: (BuildContext ctx, AsyncSnapshot<DocumentSnapshot> snap){
if(snap.hasData) {
user = myUser(snap.data);
return OnSlide(
items: <ActionItems>[
new ActionItems(
icon: IconButton(
icon: Icon(Icons.delete),
onPressed: () {},
color: Colors.red),
onPress: () =>
({
FireHelper().deleteComment(currentPost.ref, user.uid, comment.text, comment.date),
comments.remove(comment),
print("comment deleted."),
}),
backgroudColor: Colors
.transparent)
],
child: CommentTile(comment, user)
);
} else {
return LoadingCenter();
}
});
}
else {
return StreamBuilder(
stream: FireHelper().fire_user.doc(comment.userId).snapshots(),
builder: (BuildContext ctx, AsyncSnapshot<DocumentSnapshot> snap){
if(snap.hasData) {
user = myUser(snap.data);
return CommentTile(comment, user);
} else {
return LoadingCenter();
}
}
);
}
}
});
} else {
return LoadingCenter();
};
}
你可以试试玩卷轴物理。在您的 ListView
下添加:
physics: ClampingScrollPhysics()
有很多卷轴物理选项: Flutter ListView and ScrollPhysics: A Detailed Look