flutter - FittedBox 内的 ListView 不可滚动
问题描述
虽然FittedBox
缩放ListView
正确,但我无法水平滚动 ListView:
import 'dart:ui';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
scrollBehavior: MyCustomScrollBehavior(),
home: Scaffold(
body: Container(
height: 200,
child: FittedBox(
alignment: Alignment(-1, -1),
fit: BoxFit.fitHeight,
child: Container(
height: 100,
child: ListView.builder(
itemCount: 20,
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemBuilder: (context, index) => Container(
width: 100,
height: 100,
child: Text(index.toString()),
decoration: BoxDecoration(border: Border.all(width: 3, color: Colors.red)))),
),
),
)),
);
}
}
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods and getters like dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
};
}
相反,会显示前几个可见的容器。ListView 在没有 FittedBox 的情况下正确滚动。
有趣的是,如果我指定一个带有 initialScrollOffset 的 ScrollController(),ListView 最初会显示在指定的滚动偏移量处,然后动画回到偏移量 0。
解决方案
我最终将每个 ListView 项目包装在 FittedBox 中。在我的实际代码中,每个列表项都很复杂,因此将它们包装在 FittedBox 中可以让我响应地缩放它们。如果我能够在能够滚动的同时执行上述操作,那就太好了。
import 'dart:ui';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
scrollBehavior: MyCustomScrollBehavior(),
home: Scaffold(
body: Row(
children: [
SizedBox(width: 30),
Expanded(
child: Container(
height: 200,
child: ListView.builder(
itemCount: 20,
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemBuilder: (context, index) => Container(
height: 200,
child: FittedBox(
alignment: Alignment.topLeft,
fit: BoxFit.fitHeight,
child: Container(
width: 100,
height: 100,
child: Text(index.toString()),
decoration: BoxDecoration(border: Border.all(width: 3, color: Colors.red))),
),
)),
),
),
],
)),
);
}
}
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods and getters like dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
};
}
推荐阅读
- r - Create Histogram, grouping by a column and then sum by another in R
- python - 为什么我不能使用 Python(使用此代码)通过 MQTT 将图像发送到 Google Cloud IoT Core?
- typescript - 包装第三个库函数的类型定义
- c++ - C++ pimpl 成语和导出数据结构
- c# - 当我单击按钮时,如何在另一个页面上调用 void?
- swift - 从 Swift 5 中的 firebase 实时数据库返回一个 int
- c# - 有没有办法在 C# 的部分类中编写相同的属性名称?
- jquery - jQuery 按按钮类显示和隐藏 div
- vue.js - 根据响应中收到的值动态更改项目的图标
- node.js - Ember js - 无法使用 urlFor 方法生成带有动态段的 URL