首页 > 其他分享 >Flutter进阶组件(1):RadioListTiles(单选列表项)

Flutter进阶组件(1):RadioListTiles(单选列表项)

时间:2024-12-26 09:43:05浏览次数:3  
标签:RadioListTiles const 进阶 Text value 单选 RadioListTile subtitle selectedValue

RadioListTile是一个特殊的ListTile,它内嵌了一个单选按钮(Radio),包含更多信息的单选项,提供多种配置信息的属性,可以表现更丰富的信息。这使得它非常适合用来创建单选列表项,常用于让用户在多个选项中选择一个的场景。

一、属性

RadioListTile组件提供了以下属性,以支持各种自定义需求:

  • title: 显示的标题,通常是一个Text Widget。
  • subtitle: 显示的副标题,也可以是一个Text Widget。
  • value: 表示这个RadioListTile的值。
  • groupValue: 表示整个单选组选中的值。
  • onChanged: 当单选按钮的值改变时调用的回调函数。
  • secondary: 显示在标题旁边的Widget,如图标或图片。
  • isThreeLine: 决定是否显示三行文本,如设置为true,则副标题会换行显示。
  • dense: 是否减少列表项的高度,使文字更紧凑。
  • contentPadding: 控制内边距。

二、示例

以下是一个使用RadioListTile的示例:

import 'package:flutter/material.dart';

void main() {
  runApp(const MaterialApp(
    home: RadioPage(),
    debugShowCheckedModeBanner: false,
  ));
}

class RadioPage extends StatelessWidget {
  const RadioPage({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Radio Page'),
      ),
      body: const Center(
        child: MyRadioGroup(),
      ),
    );
  }
}

class MyRadioGroup extends StatefulWidget {
  const MyRadioGroup({super.key});
  @override
  State<MyRadioGroup> createState() => _MyRadioGroupState();
}

class _MyRadioGroupState extends State<MyRadioGroup> {
  int _selectedValue = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        RadioListTile(
          title: const Text('Option 1'),
          value: 1,
          groupValue: _selectedValue,
          onChanged: (value) {
            setState(() {
              _selectedValue = value as int;
            });
          },
        ),
        RadioListTile(
          title: const Text('Option 2'),
          value: 2,
          groupValue: _selectedValue,
          onChanged: (value) {
            setState(() {
              _selectedValue = value as int;
            });
          },
        ),
      ],
    );
  }
}

在上面的示例中,我们创建了一个名为MyRadioGroup的有状态(stateful)小部件。通过使用RadioListTile,我们为每个选项创建了一个单选按钮,并使用groupValue属性指定当前选中的值。onChanged回调函数在选择改变时被调用,通过调用setState来更新选择的值。效果图如下所示:

Flutter_checkBox_B.png


三、高级用法

RadioListTile可以与图标、副标题等结合使用,创建复杂的列表项:

class _MyRadioGroupState extends State<MyRadioGroup> {
  int _selectedValue = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        RadioListTile(
          title: const Text('First Option with icon and subtitle'),
          subtitle: const Text('This is a subtitle for the option'),
          secondary: const Icon(Icons.ac_unit), // 显示在标题旁边的图标
          value: 1,
          groupValue: _selectedValue,
          onChanged: (int? value) {
            setState(() {
              _selectedValue = value!;
            });
          },
          isThreeLine: true, // 显示三行文本
        ),
        RadioListTile(
          title: const Text('Second Option with icon and subtitle'),
          subtitle: const Text('This is a subtitle for the option'),
          secondary: const Icon(Icons.access_alarm), // 显示在标题旁边的图标
          value: 2,
          groupValue: _selectedValue,
          onChanged: (int? value) {
            setState(() {
              _selectedValue = value!;
            });
          },
          isThreeLine: true, // 显示三行文本
        ),        
      ],
    );
  }
}

效果图如下所示:

Flutter_checkBox_F.png


四、自定义RadioListTile

你可以通过设置不同的属性来定制RadioListTile的外观:

class _MyRadioGroupState extends State<MyRadioGroup> {
  int _selectedValue = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        RadioListTile(
          title: const Text('First Custom RadioListTile'),
          subtitle: const Text('This is a custom subtitle'),
          value: 1,
          groupValue: _selectedValue,
          onChanged: (int? value) {
            setState(() {
              _selectedValue = value!;
            });
          },
          activeColor: Colors.green, // 单选按钮激活时的颜色
          contentPadding: const EdgeInsets.all(12.0), // 自定义内边距
        ),
        
        RadioListTile(
          title: const Text('Second Custom RadioListTile'),
          subtitle: const Text('This is a custom subtitle'),
          value: 2,
          groupValue: _selectedValue,
          onChanged: (int? value) {
            setState(() {
              _selectedValue = value!;
            });
          },
          activeColor: Colors.green, // 单选按钮激活时的颜色
          contentPadding: const EdgeInsets.all(12.0), // 自定义内边距
        ),       
      ],
    );
  }
}

效果图如下所示:

Flutter_checkBox_G.png


五、扩展:同时使用Radio和RadioListTile的示例

// ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});    
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: RadioPage(),
      )
    );
  }
}

class RadioPage extends StatefulWidget {
  const RadioPage({super.key});  
  @override
  State<RadioPage> createState() => _RadioPageState();    
}

class _RadioPageState extends State<RadioPage> {
  int ?sex = 1;
  int ?status = 1;
  bool ?flag = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: Text("Radio"),
      ),
      body:Padding(
          padding: EdgeInsets.all(20),
          child:Column(
            children: <Widget>[
              // 简易选择项
              Row(
                children: <Widget>[
                    Text("男"),
                    Radio(
                        // 按钮的值
                        value: 1,
                        // 改变事件
                        onChanged: (value){
                            setState(() {
                              sex = value;
                            });
                        },
                        // 按钮组的值
                        groupValue:this.sex ,
                    ),

                    SizedBox(width: 20,),
                    Text("女"),
                    Radio(
                        value:2,
                        onChanged: (value){
                            setState(() {
                              sex = value;
                            });
                        },
                        groupValue: sex,
                    ),
                ],
              ),

              // 组合选择项1
              RadioListTile(
                value:1, 
                groupValue:status, 
                onChanged:(value){
                    setState(() {
                        status = value;
                    });
                },
                title:Text("标题"),
                subtitle:Text("这是二级标题"),
                secondary:Icon(Icons.help),
                selected:status == 1,
              ),

              // 组合选择项2
              RadioListTile(
                value:2, 
                groupValue:status, 
                onChanged:(value){
                    setState(() {
                        status = value;
                    });
                },
                title:Text("标题"),
                subtitle:Text("这是二级标题"),
                secondary:Image.network('https://www.itying.com/images/flutter/1.png'),
                selected:status == 2,
              ),
            ],
          )
        )
    );
  }
}

效果图如下所示:

Flutter_checkBox_E.png


标签:RadioListTiles,const,进阶,Text,value,单选,RadioListTile,subtitle,selectedValue
From: https://www.cnblogs.com/linuxAndMcu/p/18631946

相关文章

  • Flutter进阶组件(3):SwitchListTile(开关列表项)
    SwitchListTile是一个包含开关(Switch)的列表项,非常适合用来创建带有标题、副标题以及开关的列表项,常用于设置界面,让用户可以轻松地开启或关闭某个功能。一、基本使用SwitchListTile(title:constText('EnableNotifications'),value:true,//开关的初始状态onChanged......
  • Flutter进阶组件(2):CheckboxListTile(复选框列表项)
    CheckboxListTile是一个特殊的ListTile,它内嵌了一个复选框(Checkbox)。这使得它非常适合用来创建一个带有标题和可选复选框的列表项,常用于设置界面或需要用户选择多个选项的场景。一、属性CheckboxListTile组件提供了以下属性,以支持各种自定义需求:title:显示的标题,通常是一个Te......
  • protected修饰符讲解、java中继承的特点-java se进阶 day01
    1.protected权限修饰符的介绍之前在说权限修饰符时候,没有细说protected,今天,我们就来聊聊protected如图,protected修饰符中,“不同包的子类”是我们要理解的我们在不同的包下创建一个Fu类和一个Zi类,然后在Zi类的同一个包中创建一个test类Zi类继承Fu类,然后test不继承,仅用于测试......
  • 方法重写-java se 进阶-day01
    1.方法重写的介绍当子父类中,某方法存在相同的定义(方法名、参数、返回值)时,子类的方法会将父类的方法进行重写操作(覆盖)2.方法重写与方法重载的区别1.方法重载:又称Overload,在同一个类中,方法名相同,参数不同,与返回值无关。其中,参数不同分别为参数类型、参数数量、参数顺序不同2.方......
  • 微信小程序:从基础到进阶的全面指南 (详细版)
    文章目录前言一、基础概念与结构二、核心组件三、组件传值四、生命周期五、事件处理六、数据渲染七、顶级对象以及API八、模块化九、开发工具与调试十、发布流程结语前言随着移动互联网的发展,用户对于移动应用的需求日益增长。为了满足用户快速、......
  • AGI 大模型进阶技术路线
    “AGI大模型进阶技术路线图V5.0”的思维导图。整个图的背景为白色,内容以橙色和黑色字体为主,部分重要节点用红色字体标注。 L1阶段:基础入门与概念了解大模型应用开发极简入门2024适合初学者,包括大模型应用开发的基本概念。例如,介绍常见的开发框架(如Flask、Djang......
  • Vue.js 组件开发进阶指南
    这里写目录标题引言一、组件基础回顾1.什么是Vue组件?二、动态组件开发1.使用`component`标签实现动态加载2.动态组件缓存:`<keep-alive>`三、父子组件通信进阶1.父组件向子组件传递数据:`props`2.子组件向父组件传递数据:`$emit`3.非父子组件通信:`EventBus`四......
  • AI大模型应用入门实战与进阶:构建你的第一个大模型:实战指南
    2017年是机器学习领域历史性的一年。GoogleBrain团队的研究人员推出了Transformer,它的性能迅速超越了大多数现有的深度学习方法。著名的注意力机制成为未来Transformer衍生模型的关键组成部分。Transformer架构的惊人之处在于其巨大的灵活性:它可以有效地用于各种机器......
  • C++ 游戏开发:从基础到进阶(附案例代码)
    ......
  • C++ 指针进阶:动态内存与复杂应用
    1.动态内存分配:new与delete运算符在C++编程中,动态内存分配是一项至关重要的技术,它允许我们在程序运行时根据实际需求分配和释放内存。new运算符用于在堆内存中分配内存,delete运算符则用于释放通过new分配的内存。当我们需要动态分配单个变量时,可以这样使用new:int*ptr......