я пытаюсь синхронно переместить два свитка вместе, и мне удалось переместить их, используя один, но не другой.
я использовал метод 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());
},
)
), // ===================
);
}
}
Спасибо.
Итак, я предлагаю использовать ScrollController
(документы здесь). И вот фрагмент кода о том, как их использовать.
import 'package:flutter/cupertino.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ScrollController firstScroll = ScrollController();
ScrollController secondScrollController = ScrollController();
@override
void initState() {
super.initState();
firstScroll.addListener(() {
//THIS IS called when scroll is triggered, but it might be called for other events
secondScrollController
.jumpTo(firstScroll.offset); // THIS will sync the scroll;
});
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: <Widget>[
SingleChildScrollView(
// this is the first scroll
scrollDirection: Axis.horizontal,
controller: firstScroll, // THIS IS THE FIRST SCROLL CONTROLLER
child: Container(
//TODO: add your content here here
),
),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: secondScrollController,
// HERE YOU SET THE SECOND CONTROLLER
child: Container(
//TODO: add your content here
),
)
],
),
);
}
}
Обратите внимание, что код — это всего лишь фрагмент того, как вы можете перенаправить прокрутку от одного виджета прокрутки к другому. Затем вы можете реализовать любую логику в теле прослушивателя прокрутки.