Flutter列表项转换为卡片插件listtile_to_card的使用
Flutter列表项转换为卡片插件listtile_to_card的使用
特性

根据官方的 Material 3: Card,列表项和卡片都是展示列表项的好方式。
这个包提供了通过 MediaQuery.of(context).size
将小部件转换为 ListTile
或 Card
的功能。
使用方法
ListTileToCard(
breakWidth: 400,
axisDirection: AxisDirection.left,
cardMargin: const EdgeInsets.all(12),
cardElevation: 6,
cardShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
listTile: ListTile(
leading: const Icon(Icons.start),
trailing: const Icon(Icons.exit_to_app_outlined),
title: Text('Width: ${size.width}, Heigth: ${size.height}'),
onTap: _incrementCounter,
),
)
示例代码
import 'dart:developer';
import 'package:flutter/material.dart';
// import 'package:listtile_to_card/listtile_to_card.dart';
import 'listtile.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'ListTile to Card',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'ListTile to Card'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({required this.title, super.key});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
///
int _counter = 0;
///
void _incrementCounter() {
setState(() {
_counter++;
});
log(_counter.toString());
}
[@override](/user/override)
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
// log('Width: ${size.width}');
// log('Heigth: ${size.height}');
// log(Theme.of(context).cardTheme.color.toString());
// log(Theme.of(context).cardColor.toString());
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Column(
children: [
const SizedBox(
height: 60,
width: 50,
),
ListTileToCard(
cardElevation: 6,
cardShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
cardMargin: const EdgeInsets.fromLTRB(6, 0, 6, 6),
mainAxisAlignment: MainAxisAlignment.start,
flexes: (
titleFlex: 1,
leadingFlex: 6,
subtitleFlex: 1,
trailingFlex: 0,
),
boxFit: BoxFit.cover,
flexFit: FlexFit.tight,
listTile: ListTile(
leading: Image.asset(
'assets/pexels-efrem-efre-19749458.jpg',
fit: BoxFit.cover,
),
trailing: const Icon(Icons.exit_to_app_outlined),
title: const Text('street'),
subtitle:
Text('Width: ${size.width}, Heigth: ${size.height}'),
onTap: _incrementCounter,
),
),
ListTileToCard(
axisDirection: AxisDirection.right,
cardMargin: const EdgeInsets.all(6),
cardElevation: 6,
cardShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
flexes: (
titleFlex: 1,
leadingFlex: 0,
subtitleFlex: 3,
trailingFlex: 1,
),
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
listTile: ListTile(
leading: Image.asset(
'assets/pexels-marina-zvada-19562918.jpg',
),
trailing: const Icon(Icons.exit_to_app_outlined),
title: const Text('mountain'),
subtitle:
Text('Width: ${size.width}, Heigth: ${size.height}'),
onTap: _incrementCounter,
),
customWidget: Card(
child: Container(
height: 160,
width: 160,
color: Colors.blue[200],
child: const Center(
child: Text('custom'),
),
),
),
),
ListTileToCard(
breakWidth: 800,
axisDirection: AxisDirection.left,
cardMargin: const EdgeInsets.all(6),
cardElevation: 6,
cardShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
listTile: ListTile(
leading: Image.asset(
'assets/pexels-ikbal-alahmad-11182271.jpg',
),
trailing: const Icon(Icons.exit_to_app_outlined),
title: const Text('tree'),
subtitle:
Text('Width: ${size.width}, Heigth: ${size.height}'),
onTap: _incrementCounter,
),
),
ListTileToCard(
breakWidth: 1000,
axisDirection: AxisDirection.up,
cardMargin: const EdgeInsets.all(6),
cardElevation: 6,
cardShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
listTile: ListTile(
leading: Image.asset(
'assets/pexels-mooodish-18515836.jpg',
),
trailing: const Icon(Icons.exit_to_app_outlined),
title: const Text('bird'),
subtitle:
Text('Width: ${size.width}, Heigth: ${size.height}'),
onTap: _incrementCounter,
),
),
],
),
),
);
},
);
}
}
更多关于Flutter列表项转换为卡片插件listtile_to_card的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter列表项转换为卡片插件listtile_to_card的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,ListTile
是一个常用的组件,用于在列表中显示单行信息。然而,有时候你可能希望将 ListTile
转换为卡片(Card
)形式,以提供更好的视觉效果和交互体验。虽然Flutter没有直接提供 ListTile
转换为 Card
的插件,你可以通过将 ListTile
包装在 Card
组件中来实现这个效果。
使用 Card
包装 ListTile
以下是一个简单的示例,展示了如何将 ListTile
转换为 Card
:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('ListTile to Card Example'),
),
body: ListView(
children: <Widget>[
Card(
child: ListTile(
leading: Icon(Icons.album),
title: Text('Card Title 1'),
subtitle: Text('This is a subtitle'),
trailing: Icon(Icons.more_vert),
),
),
Card(
child: ListTile(
leading: Icon(Icons.album),
title: Text('Card Title 2'),
subtitle: Text('This is another subtitle'),
trailing: Icon(Icons.more_vert),
),
),
// Add more cards here
],
),
),
);
}
}
解释
-
Card
组件:Card
是一个 Material Design 卡片组件,通常用于显示一组相关的信息。它可以包含其他组件,如ListTile
、文本、图像等。 -
ListTile
组件:ListTile
是一个常用的组件,用于在列表中显示单行信息。它包括前导图标 (leading
)、标题 (title
)、副标题 (subtitle
) 和尾部图标 (trailing
) 等部分。 -
组合使用: 在这个例子中,每个
ListTile
都被包装在一个Card
组件中,从而实现了ListTile
到Card
的转换。
自定义卡片外观
你可以通过设置 Card
的 shape
、elevation
、color
等属性来自定义卡片的外观。例如:
Card(
elevation: 5.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
color: Colors.blue[50],
child: ListTile(
leading: Icon(Icons.album),
title: Text('Custom Card'),
subtitle: Text('This is a custom styled card'),
trailing: Icon(Icons.more_vert),
),
),