【发布时间】:2019-02-27 09:53:14
【问题描述】:
我正在尝试同步移动两个卷轴, 我设法用一个而不是另一个来移动它们。
我使用controller的jumpTo方法来设置对方的offset。
但如果我触摸另一个滚动条,我会收到 stack overflow 错误。
在我的示例(如下)中,如果我滚动浏览“MOVE”就可以了。
但是当我触摸“FOLLOW”时,它会给我一个错误,我必须重新启动应用程序。
这背后的解释是什么? 我该如何解决这个问题?
最后我想要有很多可以像这样移动的卷轴,
但我需要让“TEXT HERE”不要在它们之间移动。
下面是我的全部main.dart,
请试一试。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: 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> {
var c1 = ScrollController(); // controller declaration
var c2 = ScrollController();
@override void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
print('start');
return Scaffold(
appBar: AppBar(
title: new Text('data test'),
),
body: new Container( //===================================
padding: EdgeInsets.all(30),
color: Colors.blue[100],
height: 200,
child: NotificationListener<ScrollNotification>(
child: Column(
children: <Widget>[
Text('SOME TEXT HERE'),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: c1, // KONTROLER
child: Container(height: 50, color: Colors.green[100], child: Row( children: <Widget>[
Container(width: 100,child: Text('+MOOOVE -')),
Container(width: 100,child: Text('-MOOOVE -')),
Container(width: 100,child: Text('-MOOOVE -')),
Container(width: 100,child: Text('*MOOOVE *')),
Container(width: 100,child: Text('-MOOOVE -')),
Container(width: 100,child: Text('-MOOOVE -')),
Container(width: 100,child: Text('-MOOOVE +')),
],),)
),
Text('ANOTHER TEXT HERE'),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: c2, // KONTROLER
child: Container(height: 50, color: Colors.red[100], child: Row(children: <Widget>[
Container(width: 100,child: Text('+ FOLLOW-')),
Container(width: 100,child: Text('- FOLLOW-')),
Container(width: 100,child: Text('- FOLLOW-')),
Container(width: 100,child: Text('* FOLLOW*')),
Container(width: 100,child: Text('- FOLLOW-')),
Container(width: 100,child: Text('- FOLLOW-')),
Container(width: 100,child: Text('- FOLLOW+')),
],),)
),
]),
onNotification: (ScrollNotification scrollinfo) { // HEY!! LISTEN!!
c2.jumpTo( c1.offset ); // c1 is controlling c2's offset
print('OFFSET--'+c1.offset.toInt().toString()+"--"+c2.offset.toInt().toString());
},
)
), // ===================
);
}
}
谢谢。
【问题讨论】:
-
问题是因为您将
ScrollNotification与ScrollController结合使用,jumpTo会触发ScrollNotification,而后者又会触发jumpTo,这就是您收到 SO 错误的原因。您应该检查滚动时触发的ScrollController.addListener:)。 -
你能给我一个如何修复我上面的代码的例子吗?我把
.addListener放在哪里?我还应该使用onNotification吗? -
@danypata 或者也许,是否有可能有 1 个
controller来控制两个卷轴? -
我尝试使用
TrackingScrollController,但它根本不起作用。 -
我给了你一个工作代码,不是吗?它使用了两个列表,您可以滚动其中任何一个,另一个列表紧随其后
标签: scroll dart controller flutter synchronization