Flutter系统设置插件settings_tiles的使用

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

Flutter系统设置插件settings_tiles的使用

settings_tiles 是一个用于轻松创建设置屏幕的Flutter插件。它提供了多种类型的设置瓷砖(tiles),包括文本、操作、开关、复选框、单选项、多选项、文本字段、滑块、颜色选择器和关于应用程序的信息。

安装

请参阅 安装说明 来了解如何在你的项目中添加 settings_tiles 依赖。

使用

Section

创建一个设置部分,显示一组设置瓷砖,并可选地用分隔线分开,并在顶部有一个标题:

SettingSection(
  title: 'A setting section',
  tiles: [
    // A list of tiles
  ],
)

要移除设置瓷砖之间的分隔线,请将 divider 参数设置为 null

Tiles

Text

一个仅显示文本且没有交互的简单瓷砖:

const SettingTextTile(
  icon: Icons.abc,
  title: 'Text',
  description: 'This is a text tile',
)

Action

当点击时调用某个动作的瓷砖:

SettingActionTile(
  icon: Icons.touch_app,
  title: 'Action',
  description: 'This is an action tile',
  onTap: () {
    print('The action tile was tapped');
  },
),

Switch

显示一个开关的瓷砖:

SettingSwitchTile(
  icon: Icons.toggle_on,
  title: 'Switch',
  description: 'This is a switch tile',
  toggled: true,
  onChanged: (value) {
    // Handle state change
  },
)

Checkbox

显示一个复选框的瓷砖:

SettingCheckboxTile(
  icon: Icons.check_box,
  title: 'Checkbox',
  description: 'This is a checkbox tile',
  checked: true,
  onChanged: (value) {
    if (value == null) {
      return;
    }

    // Handle state change
  },
)

Single Option

显示一个对话框以选择单个选项的瓷砖:

SettingSingleOptionTile(
  icon: Icons.radio_button_on,
  title: 'Single option',
  description: 'This is a single option tile',
  dialogTitle: 'Options',
  options: const ['Option 1', 'Option 2', 'Option 3'],
  initialOption: 'Option 1',
  onSubmitted: (value) {
    // Handle state change
  },
)

详细构造函数允许你指定每个选项的标题和可选的副标题:

SettingSingleOptionTile.detailed(
  icon: Icons.radio_button_on,
  title: 'Single option (detailed)',
  description: 'This is a detailed single option tile',
  dialogTitle: 'Options',
  options: const [
    (value: 'Option 1', title: 'Option n°1', subtitle: 'This is option n°1'),
    (value: 'Option 2', title: 'Option n°2', subtitle: 'This is option n°2'),
    (value: 'Option 3', title: 'Option n°3', subtitle: 'This is option n°3'),
  ],
  initialOption: selectedOption,
  onSubmitted: (value) {
    // Handle state change
  },
),

Multiple Options

显示一个对话框以选择多个选项的瓷砖:

SettingMultipleOptionsTile(
  icon: Icons.checklist,
  title: 'Multiple options',
  description: 'This is a multiple options tile',
  dialogTitle: 'Options',
  options: const ['Option 1', 'Option 2', 'Option 3'],
  initialOptions: const ['Option 1', 'Option 3'],
  onSubmitted: (value) {
    // Handle state change
  },
)

详细构造函数允许你指定每个选项的标题和可选的副标题:

SettingMultipleOptionsTile.detailed(
  icon: Icons.checklist,
  title: 'Multiple options (detailed)',
  description: 'This is a detailed multiple options tile',
  dialogTitle: 'Options',
  options: const [
    (value: 'Option 1', title: 'Option n°1', subtitle: 'This is option n°1'),
    (value: 'Option 2', title: 'Option n°2', subtitle: 'This is option n°2'),
    (value: 'Option 3', title: 'Option n°3', subtitle: 'This is option n°3'),
  ],
  initialOptions: const ['Option 1', 'Option 3'],
  onSubmitted: (value) {
    // Handle state change
  },
),

Text Field

显示一个包含文本字段的对话框的瓷砖:

SettingTextFieldTile(
  icon: Icons.text_fields,
  title: 'Text field',
  description: 'This is a text field tile',
  dialogTitle: 'Text',
  initialText: 'Some text',
  onSubmitted: (value) {
    // Handle state change
  },
)

Slider

显示一个包含滑块的对话框的瓷砖:

SettingSliderTile(
  icon: Icons.linear_scale,
  title: 'Slider',
  description: 'This is a slider tile',
  dialogTitle: 'Slider',
  min: 1.0,
  max: 10.0,
  divisions: 9,
  initialValue: 5.0,
  onSubmitted: (value) {
    // Handle state change
  },
)

Color Picker

显示一些颜色选择器和所选颜色预览的对话框的瓷砖:

SettingColorTile(
  icon: Icons.color_lens,
  title: 'Color',
  description: 'This is a color tile',
  dialogTitle: 'Color',
  initialColor: Colors.blue,
  onSubmitted: (value) {
    // Handle state change
  },
)

要更改可用的颜色选择器,请设置 colorPickers 参数。若要启用所有颜色选择器,请将其设置为 ColorPickerType.values

About

显示应用程序信息并在点击时打开 Flutter 的 AboutDialog 的瓷砖:

const SettingAboutTile(
  applicationIcon: Image.asset('assets/icon/icon.png'),
  title: 'Application name',
  description: 'v1.0.0',
)

需要将应用程序名称传递给 title 参数,并将版本传递给 description 参数。

示例 Demo

以下是一个完整的示例 demo,展示如何使用 settings_tiles 插件:

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

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool toggled = true;
  bool checked = true;
  String selectedOption = 'Option 1';
  List<String> selectedOptions = ['Option 1', 'Option 3'];
  double sliderValue = 5.0;
  Color color = Colors.blue;
  String text = 'Some text';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('settings_tiles example'),
        ),
        body: Builder(builder: (context) {
          return SingleChildScrollView(
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  SettingSection(
                    title: 'Section',
                    divider: null,
                    tiles: [
                      const SettingTextTile(
                        icon: Icons.abc,
                        title: 'Text',
                        description: 'This is a text tile',
                      ),
                      SettingActionTile(
                        icon: Icons.touch_app,
                        title: 'Action',
                        description: 'This is an action tile',
                        onTap: () {
                          ScaffoldMessenger.of(context).showSnackBar(
                            SnackBar(
                              content: Text('The action tile was tapped!'),
                              behavior: SnackBarBehavior.floating,
                            ),
                          );
                        },
                      ),
                      SettingSwitchTile(
                        icon: Icons.toggle_on,
                        title: 'Switch',
                        description: 'This is a switch tile',
                        toggled: toggled,
                        onChanged: (value) {
                          setState(() {
                            toggled = value;
                          });
                        },
                      ),
                      SettingCheckboxTile(
                        icon: Icons.check_box,
                        title: 'Title',
                        description: 'This is a checkbox tile',
                        checked: checked,
                        onChanged: (value) {
                          if (value == null) {
                            return;
                          }

                          setState(() {
                            checked = value;
                          });
                        },
                      ),
                      SettingSingleOptionTile(
                        icon: Icons.radio_button_on,
                        title: 'Single option',
                        description: 'This is a single option tile',
                        dialogTitle: 'Options',
                        options: const ['Option 1', 'Option 2', 'Option 3'],
                        initialOption: selectedOption,
                        onSubmitted: (value) {
                          setState(() {
                            selectedOption = value;
                          });
                        },
                      ),
                      SettingSingleOptionTile.detailed(
                        icon: Icons.radio_button_on,
                        title: 'Single option (detailed)',
                        description: 'This is a detailed single option tile',
                        dialogTitle: 'Options',
                        options: const [
                          (
                            value: 'Option 1',
                            title: 'Option n°1',
                            subtitle: 'This is option n°1'
                          ),
                          (
                            value: 'Option 2',
                            title: 'Option n°2',
                            subtitle: 'This is option n°2'
                          ),
                          (
                            value: 'Option 3',
                            title: 'Option n°3',
                            subtitle: 'This is option n°3'
                          ),
                        ],
                        initialOption: selectedOption,
                        onSubmitted: (value) {
                          setState(() {
                            selectedOption = value;
                          });
                        },
                      ),
                      SettingMultipleOptionsTile(
                        icon: Icons.checklist,
                        title: 'Multiple options',
                        description: 'This is a multiple options tile',
                        dialogTitle: 'Options',
                        options: const ['Option 1', 'Option 2', 'Option 3'],
                        initialOptions: selectedOptions,
                        onSubmitted: (value) {
                          setState(() {
                            selectedOptions = value;
                          });
                        },
                      ),
                      SettingMultipleOptionsTile.detailed(
                        icon: Icons.checklist,
                        title: 'Multiple options (detailed)',
                        description: 'This is a detailed multiple options tile',
                        dialogTitle: 'Options',
                        options: const [
                          (
                            value: 'Option 1',
                            title: 'Option n°1',
                            subtitle: 'This is option n°1'
                          ),
                          (
                            value: 'Option 2',
                            title: 'Option n°2',
                            subtitle: 'This is option n°2'
                          ),
                          (
                            value: 'Option 3',
                            title: 'Option n°3',
                            subtitle: 'This is option n°3'
                          ),
                        ],
                        initialOptions: selectedOptions,
                        onSubmitted: (value) {
                          setState(() {
                            selectedOptions = value;
                          });
                        },
                      ),
                      SettingTextFieldTile(
                        icon: Icons.text_fields,
                        title: 'Text field',
                        description: 'This is a text field tile',
                        dialogTitle: 'Text',
                        initialText: text,
                        onSubmitted: (value) {
                          setState(() {
                            text = value;
                          });
                        },
                      ),
                      SettingSliderTile(
                        icon: Icons.linear_scale,
                        title: 'Slider',
                        description: 'This is a slider tile',
                        dialogTitle: 'Slider',
                        min: 1.0,
                        max: 10.0,
                        divisions: 9,
                        initialValue: sliderValue,
                        onSubmitted: (value) {
                          setState(() {
                            sliderValue = value;
                          });
                        },
                      ),
                      SettingColorTile(
                        icon: Icons.color_lens,
                        title: 'Color',
                        description: 'This is a color tile',
                        dialogTitle: 'Color',
                        initialColor: color,
                        onSubmitted: (value) {
                          setState(() {
                            color = value;
                          });
                        },
                      ),
                      SettingAboutTile(
                        applicationIcon: Image.asset(
                          'assets/icon/icon.png',
                          fit: BoxFit.fitWidth,
                          height: 64,
                        ),
                        title: 'Application',
                        description: 'v1.0.0',
                      ),
                    ],
                  ),
                  SettingSection(
                    title: 'Section with dividers',
                    tiles: [
                      const SettingTextTile(
                        icon: Icons.abc,
                        title: 'Tile 1',
                        description: 'This is a text tile',
                      ),
                      SettingActionTile(
                        icon: Icons.touch_app,
                        title: 'Tile 2',
                        description: 'This is an action tile',
                        onTap: () {
                          ScaffoldMessenger.of(context).showSnackBar(
                            SnackBar(
                              content: Text('The action tile was tapped!'),
                              behavior: SnackBarBehavior.floating,
                            ),
                          );
                        },
                      ),
                      const SettingTextTile(
                        icon: Icons.abc,
                        title: 'Tile 3',
                        description: 'This is a text tile',
                      ),
                    ],
                  )
                ],
              ),
            ),
          );
        }),
      ),
    );
  }
}

这个示例展示了如何使用各种类型的设置瓷砖来创建一个完整的设置页面。你可以根据自己的需求调整和扩展这些示例代码。


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用settings_tiles插件的示例代码。settings_tiles是一个方便创建系统设置界面的Flutter插件,允许开发者以类似于Android系统设置页面的方式展示设置项。

首先,你需要在你的pubspec.yaml文件中添加对settings_tiles的依赖:

dependencies:
  flutter:
    sdk: flutter
  settings_tiles: ^2.0.0  # 请检查最新版本号并替换

然后运行flutter pub get来获取依赖。

接下来,我们编写一个简单的Flutter应用,展示如何使用settings_tiles

main.dart

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

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

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

class SettingsScreen extends StatefulWidget {
  @override
  _SettingsScreenState createState() => _SettingsScreenState();
}

class _SettingsScreenState extends State<SettingsScreen> {
  bool _switchValue = false;
  String _textFieldValue = "";

  void _onSwitchChanged(bool value) {
    setState(() {
      _switchValue = value;
    });
  }

  void _onTextFieldChanged(String value) {
    setState(() {
      _textFieldValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: ListView(
          children: <Widget>[
            SettingsTile.switchTile(
              title: 'Switch Setting',
              switchValue: _switchValue,
              onToggle: _onSwitchChanged,
            ),
            SettingsTile.header(title: 'Text Settings'),
            SettingsTile.textTile(
              title: 'Text Setting',
              initialValue: _textFieldValue,
              onSaved: (String value) {
                _onTextFieldChanged(value);
              },
            ),
            SettingsTile.header(title: 'Number Settings'),
            SettingsTile.sliderTile(
              title: 'Slider Setting',
              initialValue: 50.toDouble(),
              min: 0.toDouble(),
              max: 100.toDouble(),
              onChanged: (double value) {
                // Handle slider value change
                print("Slider value: $value");
              },
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:首先在pubspec.yaml中添加settings_tiles依赖。
  2. 应用结构
    • MyApp是一个简单的Material应用,设置了主题并指定了主页为SettingsScreen
    • SettingsScreen是一个有状态组件,管理开关和文本字段的状态。
  3. SettingsTiles的使用
    • SettingsTile.switchTile:创建一个开关设置项,绑定到_switchValue,并在开关值变化时调用_onSwitchChanged
    • SettingsTile.header:添加一个头部,用于分组设置项。
    • SettingsTile.textTile:创建一个文本设置项,绑定到_textFieldValue,并在文本变化时调用_onTextFieldChanged
    • SettingsTile.sliderTile:创建一个滑块设置项,并处理滑块值的变化。

这个例子展示了如何使用settings_tiles插件创建一些基本的系统设置项。你可以根据需要进一步自定义和扩展这些设置项。

回到顶部