我正在尝试为该屏幕提供特定的滚动行为。每行都有使用BLoC模式提供的数据。屏幕的左侧仅需要垂直滚动,而右侧则需要水平和垂直滚动。我目前正在通过具有两个单独的列表视图进行垂直滚动并共享BLoC来做到这一点。然后,将右侧小部件包装在沿相反方向移动的列表视图中。
我需要同步垂直列表视图和水平列表视图(以及将来可能的滚动视图),并且无法成功确保滚动位置保持同步。如何同步多个列表视图位置?这是我要执行的操作的代码段:
class ComposePage extends StatefulWidget {
@override
_ComposePageState createState() => _ComposePageState();
}
class _ComposePageState extends State<ComposePage> {
final TrackingScrollController _scrollController = TrackingScrollController();
@override
Widget build(BuildContext context) {
return Container(
child: NotificationListener<ScrollNotification>(
onNotification: (notification) {
print("SCROLL");
_scrollController.position.setPixels(notification.metrics.pixels);
for (ScrollPosition position in _scrollController.position)
position.setPixels(notification.metrics.pixels);
},
child: Column(
verticalDirection: VerticalDirection.up,
children: <Widget>[
Expanded(
flex: 8,
child: Material(
type: MaterialType.canvas,
elevation: 1.0,
child: _buildBuildComposeContent(_scrollController),
),
),
Expanded(
flex: 1,
child: Material(
type: MaterialType.canvas,
elevation: 20.0,
child: ControlsHeader(),
),
)
],
),
),
color: Colors.green,
);
}
_buildBuildComposeContent(TrackingScrollController scrollController) {
return Container(
child: Row(
children: <Widget>[
Expanded(
flex: 1,
child: _buildLabelArea(scrollController),
),
Expanded(
flex: 7,
child: _buildEditArea(scrollController),
),
],
),
);
}
Column _buildLabelArea(TrackingScrollController controller) {
return Column(
children: [
Expanded(
flex: 1,
child: Container(
color: Colors.pink,
),
),
Expanded(
flex: 8,
child: ListView(
scrollDirection: Axis.vertical,
controller: controller,
children: <Widget>[
BlocProvider(
bloc: TrackBloc(),
child: TrackLabel(),
),
BlocProvider(
bloc: TrackBloc(),
child: TrackLabel(),
),
BlocProvider(
bloc: TrackBloc(),
child: TrackLabel(),
),
BlocProvider(
bloc: TrackBloc(),
child: TrackLabel(),
),
],
),
),
],
);
}
Column _buildEditArea(TrackingScrollController controller) {
return Column(
children: <Widget>[
Expanded(
flex: 1,
child: Playhead(),
),
Expanded(
flex: 8,
child: Container(
child: ListView(
scrollDirection: Axis.vertical,
controller: controller,
children: <Widget>[
BlocProvider(
bloc: TrackBloc(),
child: TrackView(isEditable: true),
),
BlocProvider(
bloc: TrackBloc(),
child: TrackView(isEditable: true),
),
BlocProvider(
bloc: TrackBloc(),
child: TrackView(isEditable: true),
),
BlocProvider(
bloc: TrackBloc(),
child: TrackView(isEditable: true),
),
],
),
),
),
],
);
}
}