Flutter无限滚动视图插件infinity_view的使用
Flutter无限滚动视图插件infinity_view的使用
infinity_view
简介
Infinity View 允许您轻松创建无限视口,无论是图像、画布还是整个应用程序——天空是你的限制!
与 InteractiveViewer
不同,它没有边界,允许您进行缩放、平移和旋转。
特性
- 支持所有平台,支持触摸、鼠标和触控板,并且具有设备特定的控制。
- 高度可定制,允许您仅在满足某些条件时启用变换。
- 无限的力量! 您可以在您的 InfinityView 中放置任何内容,您可以从您的子级 widget 平移得更远,您可以缩放得更远。
开始
安装包:
flutter pub add infinity_view
导入包(如果使用 Notepad 作为 IDE):
import 'package:infinity_view/infinity_view.dart';
最后将您想要的 widget 包裹在 InfinityView
中:
InfinityView(
child: Image.network('https://i.imgur.com/tCoqEwy.gif');
)
使用
InfinityView 非常简单易用,只需将其包裹在一个 widget 中即可。 但,使 InfinityView 如此强大的是它的灵活性(上、下、左、右、进、出、以及 环游小镇—啊对了,这就是灵活的意思)。
默认情况下,旋转被禁用,但可以通过 shouldRotate
启用:
InfinityView(
shouldRotate: true,
child: ...,
)
如果您想限制哪些事件可以影响变换?您可以使用 translationTest
、scaleTest
和 rotationTest
。
这些参数接受一个 TransformTestCallback
,提供 GenericTransformUpdateDetails
并返回一个布尔值。GenericTransformUpdateDetails
包含有关输入的信息,供您比较。
例如,如果您只想在右键按下时平移,您可以这样设置 translationTest
:
InfinityView(
translationTest: (details) => details.buttons == kSecondaryMouseButton,
...
)
这会起作用!但它也不考虑并非所有设备都使用鼠标,或者我们可以进一步深入:
InfinityView(
translationTest: (details) {
if(details.kind == PointerDeviceKind.mouse &&
details.buttons != kSecondaryMouseButton)
return false;
return true;
},
...
)
这将只允许在鼠标上使用右键点击进行平移,但现在它将接受任何触控板和平移事件。如果我们想要更加具体:
InfinityView(
translationTest: (details) {
return details.buttons == kSecondaryMouseButton ||
details.pointerCount > 1 ||
details.kind == PointerDeviceKind.trackpad;
},
...
)
这将只在以下情况下平移:
- 鼠标:右键被按下。
- 触摸:两个手指(或更多)正在使用。
- 触控板:总是。
原因是我们总是使用触控板,因为触控板发送的唯一事件是
PanZoomUpdate
,这意味着有人在缩放、旋转或滚动。点击事件仍然被视为鼠标输入。
也许您希望根据外部条件仅允许某些变换。例如,您只想在按住控制键时缩放:
bool isControlPressed = false;
RawKeyboardEvent(
onKey: (e) => isControlPressed = e.isControlPressed
child: InfinityView(
scaleTest: (details) => isControlPressed,
child: ...
),
)
很简单!
遇到问题吗?
您可能需要使用 shrinkWrap
。
默认情况下,shrinkWrap
设置为 true
。这将传递 InfinityView
的的约束给子级 widget。虽然 widget 不一定受到这些约束的限制,但它会影响布局。
如果您正在使用一个具有无限大小的 widget,如 Stack
,必须将 shrinkWrap
设置为 true
,因为您不能在一个无限大小的 widget 内部包含另一个无限大小的 widget。
通过关闭 shrinkWrap
,InfinityView
将有一个最大尺寸为无限大,这意味着不会传递给子级 widget 任何约束。这意味着子级 widget 必须有一个定义的大小小于无穷大。
为了展示 shrinkWrap
的工作原理,这里是一个非常基本的例子:
InfinityView(
shrinkWrap: true, // 这是默认值。
child: FlutterLogo(size: 5000),
)
如果我们将 shrinkWrap
设置为 false
,它不再受父容器的约束,并可以占据其全部大小。
两者都是无限可变形的。
再次强调,仅仅因为约束传递给了子级容器并不意味着它不能超出这些约束。您可以在 Stack
中使用 shrinkWrap
,但如果不这样做就会出现错误。
InfinityView(
shrinkWrap: true, // 这是默认值,指定这个不是必需的。
child: const Stack(
alignment: Alignment.center,
clipBehavior: Clip.none,
children: [
Positioned(
width: 5000,
height: 5000,
child: FlutterLogo()
),
]
),
)
更多关于Flutter无限滚动视图插件infinity_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter无限滚动视图插件infinity_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用infinity_view
插件来实现无限滚动视图的示例代码。infinity_view
是一个用于创建无限滚动列表的Flutter插件。请注意,实际使用时,你需要确保已经在pubspec.yaml
文件中添加了infinity_view
依赖。
首先,确保你的pubspec.yaml
文件包含以下依赖:
dependencies:
flutter:
sdk: flutter
infinity_view: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来是一个简单的示例代码,展示如何使用infinity_view
来创建一个无限滚动的列表:
import 'package:flutter/material.dart';
import 'package:infinity_view/infinity_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Infinity View Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: InfinityViewExample(),
);
}
}
class InfinityViewExample extends StatefulWidget {
@override
_InfinityViewExampleState createState() => _InfinityViewExampleState();
}
class _InfinityViewExampleState extends State<InfinityViewExample> {
final List<String> initialData = List.generate(20, (index) => "Item $index");
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Infinity View Example'),
),
body: InfinityListView.builder(
itemCount: initialData.length, // 初始数据项数量
itemBuilder: (context, index) {
return ListTile(
title: Text(initialData[index]),
);
},
onLoadMore: () async {
// 模拟加载更多数据
List<String> newData = List.generate(20, (index) => "Item ${initialData.length + index}");
setState(() {
initialData.addAll(newData);
});
return newData.length; // 返回实际加载的数据项数量
},
),
);
}
}
在这个示例中:
- 我们创建了一个简单的Flutter应用,其中包含一个使用
InfinityListView.builder
构建的列表。 initialData
是一个包含初始数据的列表。InfinityListView.builder
的itemCount
属性设置为初始数据的长度。itemBuilder
回调用于构建每个列表项。onLoadMore
回调用于加载更多数据。当用户滚动到底部时,这个回调会被触发。在这个示例中,我们模拟加载了更多的数据,并将它们添加到initialData
列表中。
请注意,onLoadMore
回调是异步的,允许你进行网络请求或其他耗时操作来加载数据。在实际应用中,你应该根据网络请求的结果来更新数据列表。
这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改,例如添加错误处理、加载指示器或优化性能。