Flutter列表项开关插件list_tile_switch的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter列表项开关插件list_tile_switch的使用

描述

ListTileSwitch 是一个简单的Flutter小部件,它将 ListTile 与开关(Switch)组合在一起。此插件提供了三种类型的开关组件:

  1. Material Switch:来自Flutter SDK中Material库的标准开关。
  2. CupertinoSwitch:来自Flutter SDK中Cupertino库的iOS风格开关。
  3. 自定义开关:允许开发者创建自己设计的开关。

Demo

该插件已经在Android和Web上进行了测试,理论上也应该可以在iOS设备上正常工作,因为它只包含纯Dart和Flutter组件。

安装

在你的pubspec.yaml文件中添加依赖:

dependencies:
    list_tile_switch: ^latest_version # 替换为最新版本号

然后运行flutter pub get来安装依赖。

使用方法

ListTileSwitch可以像普通的ListTile一样使用,并且额外提供了一个作为尾部组件的开关。以下是主要参数及其含义:

参数 定义
double switchScale 调整开关的小部件比例。
Color switchActiveColor 当开关处于激活状态时的颜色。
bool toggleSelectedOnValueChange 决定当开关值改变为true时是否给ListTile着色,默认颜色是switchActiveColor
Color switchInactiveColor 开关未激活时的颜色。
SwitchType switchType 指示要显示的开关类型(Material、Cupertino或自定义)。
bool value 当前开关的状态。
onChanged(bool) 开关状态变化时触发的回调函数。

其余参数如leadingtitle等均直接映射到内部的ListTile小部件属性。

示例代码

以下是一个完整的例子,展示了如何使用ListTileSwitch来创建带有不同样式开关的列表项:

import 'package:flutter/material.dart';
import 'package:list_tile_switch/list_tile_switch.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ListTileSwitch Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: ListTileSwitchExample(title: 'ListTileSwitch Demo'),
    );
  }
}

class ListTileSwitchExample extends StatefulWidget {
  ListTileSwitchExample({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _ListTileSwitchExampleState createState() => _ListTileSwitchExampleState();
}

class _ListTileSwitchExampleState extends State<ListTileSwitchExample> {
  List<bool> _switchValues = List.generate(7, (_) => false);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            SizedBox(height: 20),
            Text(
              'ListTileSwitch with only title',
              style: TextStyle(fontWeight: FontWeight.w500, fontSize: 22),
            ),
            SizedBox(height: 20),
            // 默认自定义开关
            ListTileSwitch(
              value: _switchValues[0],
              leading: Icon(Icons.access_alarms),
              onChanged: (value) {
                setState(() {
                  _switchValues[0] = value;
                });
              },
              switchActiveColor: Colors.indigo,
              title: Text('Default Custom Switch'),
            ),
            // Cupertino 风格开关
            ListTileSwitch(
              value: _switchValues[1],
              leading: Icon(Icons.message),
              onChanged: (value) {
                setState(() {
                  _switchValues[1] = value;
                });
              },
              switchActiveColor: Colors.teal,
              switchScale: 0.8,
              switchType: SwitchType.cupertino,
              title: Text('Cupertino Switch'),
            ),
            // Material 风格开关
            ListTileSwitch(
              value: _switchValues[2],
              leading: Icon(Icons.build),
              onChanged: (value) {
                setState(() {
                  _switchValues[2] = value;
                });
              },
              switchActiveColor: Colors.deepOrange,
              switchType: SwitchType.material,
              title: Text('Material Switch'),
            ),
            SizedBox(height: 20),
            Text(
              'ListTileSwitch with subtitle',
              style: TextStyle(fontWeight: FontWeight.w500, fontSize: 22),
            ),
            SizedBox(height: 20),
            // 带有副标题的自定义开关
            ListTileSwitch(
              value: _switchValues[3],
              toggleSelectedOnValueChange: true,
              leading: Icon(Icons.access_alarms),
              onChanged: (value) {
                setState(() {
                  _switchValues[3] = value;
                });
              },
              subtitle: Text('This tile is using custom switch and subtitle.'),
              switchActiveColor: Colors.blueGrey,
              title: Text('Custom Switch'),
            ),
            // 更多带副标题的例子...
            SizedBox(height: 10),
            ListTileSwitch(
              value: _switchValues[4],
              leading: Icon(Icons.message),
              onChanged: (value) {
                setState(() {
                  _switchValues[4] = value;
                });
              },
              switchActiveColor: Colors.teal,
              switchScale: 0.8,
              subtitle: Text('This tile is using cupertino switch and subtitle.'),
              switchType: SwitchType.cupertino,
              title: Text('Cupertino Switch'),
            ),
            SizedBox(height: 10),
            ListTileSwitch(
              value: _switchValues[5],
              onChanged: (value) {
                setState(() {
                  _switchValues[5] = value;
                });
              },
              toggleSelectedOnValueChange: true,
              subtitle: Text('This tile is using material switch and subtitle.'),
              switchActiveColor: Colors.deepOrange,
              switchType: SwitchType.material,
              title: Text('Material Switch'),
            ),
            SizedBox(height: 20),
            Text(
              'ListTileSwitch with no title',
              style: TextStyle(fontWeight: FontWeight.w500, fontSize: 22),
            ),
            SizedBox(height: 20),
            ListTileSwitch(
              value: _switchValues[6],
              onChanged: (value) {
                setState(() {
                  _switchValues[6] = value;
                });
              },
              toggleSelectedOnValueChange: true,
              subtitle: Text('This tile is using material switch with only subtitle.'),
              switchActiveColor: Colors.deepOrange,
              switchType: SwitchType.material,
            ),
            SizedBox(height: 20),
          ],
        ),
      ),
    );
  }
}

这段代码创建了一个应用,其中包含了多个不同配置的ListTileSwitch实例,演示了如何根据需要定制这些开关元素。


更多关于Flutter列表项开关插件list_tile_switch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter列表项开关插件list_tile_switch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,list_tile_switch 并不是 Flutter SDK 的一个内置组件,但根据你的描述,你可能是在寻找一个结合 ListTileSwitch 的实现方式。在 Flutter 中,你可以通过自定义组件来实现类似的功能。以下是一个简单的示例,展示如何在 ListTile 中使用 Switch

首先,确保你的 Flutter 环境已经设置好,并且已经创建了一个 Flutter 项目。

接下来,你可以在你的 Dart 文件中使用以下代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter ListTile Switch Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 定义一个列表来存储开关的状态
  final List<bool> _switches = List.generate(5, (index) => false);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ListTile Switch Example'),
      ),
      body: ListView.builder(
        itemCount: _switches.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text('Item $index'),
            trailing: Switch(
              value: _switches[index],
              onChanged: (newValue) {
                setState(() {
                  _switches[index] = newValue;
                });
              },
            ),
          );
        },
      ),
    );
  }
}

代码解释

  1. 导入必要的包

    import 'package:flutter/material.dart';
    
  2. 创建主应用

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter ListTile Switch Example',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
  3. 创建主页

    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
  4. 定义状态

    class _MyHomePageState extends State<MyHomePage> {
      final List<bool> _switches = List.generate(5, (index) => false);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('ListTile Switch Example'),
          ),
          body: ListView.builder(
            itemCount: _switches.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Item $index'),
                trailing: Switch(
                  value: _switches[index],
                  onChanged: (newValue) {
                    setState(() {
                      _switches[index] = newValue;
                    });
                  },
                ),
              );
            },
          ),
        );
      }
    }
    

核心点

  • List<bool> _switches:这个列表存储了每个开关的状态。
  • ListView.builder:用于动态生成列表项。
  • ListTile:每个列表项使用 ListTile 来显示标题和开关。
  • Switch:开关组件,绑定到 _switches 列表的相应项,并在状态改变时更新列表。

通过这种方式,你可以实现一个包含多个开关项的列表,每个开关的状态都可以独立控制。

回到顶部