flutter - 如何使用不同的控制器同步两个或多个 PageView
问题描述
我有 2 个具有不同 viewportFraction 的 PageView。有什么方法可以滚动其中一个 PageViews 而另一个在同一页面上滚动或偏移?
还要问,是否可以在代码中将 PageView 控制到偏移量的中间?
class MyPageControllers extends StatefulWidget {
@override
_MyPageControllersState createState() => _MyPageControllersState();
}
class _MyPageControllersState extends State<MyPageControllers> {
PageController _controller1;
PageController _controller2;
Widget _itemBuilder(BuildContext context, int index) => Container(
color: Colors.primaries[index % Colors.primaries.length],
child: Center(
child: Text(
index.toString(),
style: TextStyle(color: Colors.white, fontSize: 60),
),
),
);
@override
void initState() {
super.initState();
_controller1 = PageController(viewportFraction: 0.8);
_controller2 = PageController(viewportFraction: 0.5);
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Expanded(
child: PageView.builder(
controller: _controller1,
itemBuilder: _itemBuilder,
),
),
SizedBox(
height: 40,
),
Expanded(
child: PageView.builder(
controller: _controller2,
itemBuilder: _itemBuilder,
),
),
],
);
}
}
解决方案
PageView
因此,您需要在其中一个小部件PageController
( )上附加一个侦听器_controller1
,然后更改offset
另一个PageView
小部件 PageController
( _controller2
) 的监听器。
initState
您需要在初始化控制器后添加这段代码:
_controller1.addListener(() {
_controller2.jumpTo(_controller1.offset);
});
更新的答案(选择页面同步):
_controller1.addListener(() {
_controller2.animateToPage(
_controller1.page.toInt(),
duration: Duration(milliseconds: 500),
curve: Curves.ease,
);
});
更新答案(检测手动滚动):
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyPageControllers(),
),
),
);
}
}
class MyPageControllers extends StatefulWidget {
@override
_MyPageControllersState createState() => _MyPageControllersState();
}
class _MyPageControllersState extends State<MyPageControllers> {
PageController _controller1;
PageController _controller2;
int manualController = -1;
Widget _itemBuilder(BuildContext context, int index) => Container(
color: Colors.primaries[index % Colors.primaries.length],
child: Center(
child: Text(
index.toString(),
style: TextStyle(color: Colors.white, fontSize: 60),
),
),
);
@override
void initState() {
super.initState();
_controller1 = PageController(viewportFraction: 0.8);
_controller2 = PageController(viewportFraction: 0.5);
_controller1.addListener(() {
if (manualController == 1) {
_controller2.jumpTo(_controller1.offset);
}
});
_controller2.addListener(() {
if (manualController == 2) {
_controller1.jumpTo(_controller2.offset);
}
});
// _controller1.addListener(() {
// _controller2.animateToPage(
// _controller1.page.toInt(),
// duration: Duration(milliseconds: 500),
// curve: Curves.ease,
// );
// });
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Expanded(
child: GestureDetector(
onTapDown: (tapDownDetails){
manualController = 1;
setState(() {});
},
onTapUp: (tapUpDetails){
manualController = -1;
setState(() {});
},
child: PageView.builder(
controller: _controller1,
itemBuilder: _itemBuilder,
),
),
),
SizedBox(
height: 40,
),
Expanded(
child: GestureDetector(
onTapDown: (tapDownDetails){
manualController = 2;
setState(() {});
},
onTapUp: (tapUpDetails){
manualController = -1;
setState(() {});
},
child: PageView.builder(
controller: _controller2,
itemBuilder: _itemBuilder,
),
),
),
],
);
}
}
推荐阅读
- bash - Powershell 问题 - 在 Git Bash 中执行命令
- java - 无法验证 GCS 存储桶和 PKIX 路径构建失败 创建和暂存 GCP 数据流模板时出错
- xamarin.forms - Xamarin.Forms:使用 SVG 图像作为 TabbedPage 上的图标
- python - 仅在一个多边形 OSMNX 中获取所有节点
- php - Laravel 非静态方法 Mavinoo\LaravelBatch\LaravelBatch::update() 不应静态调用
- javascript - 我想不明白
意义。谷歌很难 - java - 一个简单的 Spring 没有 favicon.ico - Maven Web 应用程序
- ios - 每当我在 iOS 上键入内容时,ListViews 中的 Xamarin 表单编辑器都会失去焦点
- azure - Azure:撤销用户的访问令牌,使他们无法从 Azure 中的移动后端请求数据
- javascript - 为什么我无法捕捉到返回的响应错误?