Flutter:使用复选框进行下拉多选

127 阅读2分钟

当按下升高的按钮时,将显示多选对话框。它让用户在编程中选择他们最喜欢的主题。所选主题将作为筹码显示在屏幕上。

以下是我们的应用程序的运行方式:

构建自定义多选小部件

创建一个名为MultiSelect的可重用小部件,它可以获取选项列表(您可以对这些项目进行硬编码或从数据库/API 中获取它们):

// Multi Select widget

// This widget is reusable

class MultiSelect extends StatefulWidget {

final List items;

const MultiSelect({Key? key, required this.items}) : super(key: key);

@override

State createState() => _MultiSelectState();

}

class _MultiSelectState extends State {

// this variable holds the selected items

final List _selectedItems = [];

// This function is triggered when a checkbox is checked or unchecked

void _itemChange(String itemValue, bool isSelected) {

setState(() {

if (isSelected) {

_selectedItems.add(itemValue);

} else {

_selectedItems.remove(itemValue);

}

});

}

// this function is called when the Cancel button is pressed

void _cancel() {

Navigator.pop(context);

}

// this function is called when the Submit button is tapped

void _submit() {

Navigator.pop(context, _selectedItems);

}

@override

Widget build(BuildContext context) {

return AlertDialog(

title: const Text('Select Topics'),

content: SingleChildScrollView(

child: ListBody(

children: widget.items

.map((item) => CheckboxListTile(

value: _selectedItems.contains(item),

title: Text(item),

controlAffinity: ListTileControlAffinity.leading,

onChanged: (isChecked) => _itemChange(item, isChecked!),

))

.toList(),

),

),

actions: [

TextButton(

child: const Text('Cancel'),

onPressed: _cancel,

),

ElevatedButton(

child: const Text('Submit'),

onPressed: _submit,

),

],

);

}

}

完整的代码

这是您在上面的演示中看到的应用程序的代码:

import 'package:flutter/material.dart';

void main() {

runApp(const MyApp());

}

class MyApp extends StatelessWidget {

const MyApp({Key? key}) : super(key: key);

@override

Widget build(BuildContext context) {

const String title = "坚果";

return MaterialApp(

debugShowCheckedModeBanner: false,

title: title,

theme: ThemeData(

primarySwatch: Colors.indigo,

),

home: const HomePage(),

);

}

}

// Multi Select widget

// This widget is reusable

class MultiSelect extends StatefulWidget {

final List items;

const MultiSelect({Key? key, required this.items}) : super(key: key);

@override

State createState() => _MultiSelectState();

}

class _MultiSelectState extends State {

// this variable holds the selected items

final List _selectedItems = [];

// This function is triggered when a checkbox is checked or unchecked

void _itemChange(String itemValue, bool isSelected) {

setState(() {

if (isSelected) {

_selectedItems.add(itemValue);

} else {

_selectedItems.remove(itemValue);

}

});

}

// this function is called when the Cancel button is pressed

void _cancel() {

Navigator.pop(context);

}

// this function is called when the Submit button is tapped

void _submit() {

Navigator.pop(context, _selectedItems);

}

@override

Widget build(BuildContext context) {

return AlertDialog(

title: const Text('Select Topics'),

content: SingleChildScrollView(

child: ListBody(

children: widget.items

.map((item) => CheckboxListTile(

value: _selectedItems.contains(item),

title: Text(item),

controlAffinity: ListTileControlAffinity.leading,

onChanged: (isChecked) => _itemChange(item, isChecked!),

))

.toList(),

),

),

actions: [

TextButton(

child: const Text('取消'),

onPressed: _cancel,

),

ElevatedButton(

child: const Text('确定'),

onPressed: _submit,

),

],

);

}

}

// Implement a multi select on the Home screen

class HomePage extends StatefulWidget {

const HomePage({Key? key}) : super(key: key);

@override

_HomePageState createState() => _HomePageState();

}

class _HomePageState extends State {

List _selectedItems = [];

String _title = "坚果";

void _showMultiSelect() async {

// a list of selectable items

// these items can be hard-coded or dynamically fetched from a database/API

final List _items = [

'Flutter',

'Node.js',

'React Native',

'Java',

'Docker',

'MySQL'

];

final List? results = await showDialog(

context: context,

builder: (BuildContext context) {

return MultiSelect(items: _items);

},

);

// Update UI

if (results != null) {

setState(() {

_selectedItems = results;

});

}

}

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text(_title),

),

body: Padding(

padding: const EdgeInsets.all(20),