实现滑动以关闭
“滑动以删除”模式在许多移动应用程序中很常见。例如,在编写电子邮件应用程序时,您可能希望允许用户滑动以删除电子邮件以将其从列表中删除。
Flutter 通过提供 Dismissible
小部件来简化此任务。了解如何使用以下步骤实现滑动删除。
- 创建一个项目列表。
- 将每个项目包装在
Dismissible
小部件中。 - 提供“遗留”指示器。
1. 创建一个项目列表
#首先,创建一个项目列表。有关如何创建列表的详细说明,请遵循 使用长列表 食谱。
创建数据源
#在本例中,您需要 20 个示例项目来进行操作。为了简单起见,生成一个字符串列表。
dart
final items = List<String>.generate(20, (i) => 'Item ${i + 1}');
将数据源转换为列表
#在屏幕上显示列表中的每个项目。用户目前还无法滑动删除这些项目。
dart
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
);
},
)
2. 将每个项目包装在 Dismissible 小部件中
#在此步骤中,使用 Dismissible
小部件,让用户能够滑动删除列表中的项目。
在用户滑动删除项目后,从列表中删除该项目并显示一个 SnackBar。在实际应用中,您可能需要执行更复杂的逻辑,例如从 Web 服务或数据库中删除项目。
更新 itemBuilder()
函数以返回 Dismissible
小部件。
dart
itemBuilder: (context, index) {
final item = items[index];
return Dismissible(
// Each Dismissible must contain a Key. Keys allow Flutter to
// uniquely identify widgets.
key: Key(item),
// Provide a function that tells the app
// what to do after an item has been swiped away.
onDismissed: (direction) {
// Remove the item from the data source.
setState(() {
items.removeAt(index);
});
// Then show a snackbar.
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text('$item dismissed')));
},
child: ListTile(
title: Text(item),
),
);
},
3. 提供“遗留”指示器
#目前,该应用允许用户滑动删除列表中的项目,但它没有提供视觉指示来表明删除操作的结果。为了提供提示,在用户滑动删除项目时显示“遗留”指示器。在本例中,指示器为红色背景。
要添加指示器,请向 Dismissible
提供 background
参数。
lib/{step2.dart (Dismissible) → main.dart (Dismissible)} RENAMED
@@ -16,6 +16,8 @@ | |
16 16 | ScaffoldMessenger.of(context) |
17 17 | .showSnackBar(SnackBar(content: Text('$item dismissed'))); |
18 18 | }, |
19 | + // 当项目被滑动删除时,显示红色背景。 |
20 | + background: Container(color: Colors.red), |
19 21 | child: ListTile( |
20 22 | title: Text(item), |
21 23 | ), |
交互式示例
#import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
// MyApp is a StatefulWidget. This allows updating the state of the
// widget when an item is removed.
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
MyAppState createState() {
return MyAppState();
}
}
class MyAppState extends State<MyApp> {
final items = List<String>.generate(20, (i) => 'Item ${i + 1}');
@override
Widget build(BuildContext context) {
const title = 'Dismissing Items';
return MaterialApp(
title: title,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: Scaffold(
appBar: AppBar(
title: const Text(title),
),
body: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
return Dismissible(
// Each Dismissible must contain a Key. Keys allow Flutter to
// uniquely identify widgets.
key: Key(item),
// Provide a function that tells the app
// what to do after an item has been swiped away.
onDismissed: (direction) {
// Remove the item from the data source.
setState(() {
items.removeAt(index);
});
// Then show a snackbar.
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text('$item dismissed')));
},
// Show a red background as the item is swiped away.
background: Container(color: Colors.red),
child: ListTile(
title: Text(item),
),
);
},
),
),
);
}
}