Созданием списка с подсветкой выбранного элемента в Flutter

Чтобы создать список опций и выделить выбранную опцию в Flutter, можно использовать такие виджеты, как ListView
, ListTile
, и управлять состоянием с помощью простого подхода, например, через setState
, или более продвинутого, такого как Provider
, flutter_bloc и т.д. Ниже приведен пример использования ListView
и setState
для простой реализации:
Пример:
import 'package:flutter/material.dart';
class OptionSelection extends StatefulWidget {
@override
_OptionSelectionState createState() => _OptionSelectionState();
}
class _OptionSelectionState extends State<OptionSelection> {
// Переменная для хранения индекса выбранной опции
int _selectedIndex = -1;
// Пример списка опций
final List<String> _options = [
'Опция 1',
'Опция 2',
'Опция 3',
'Опция 4',
'Опция 5',
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Выберите опцию'),
),
body: ListView.builder(
itemCount: _options.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_options[index]),
// Выделение выбранной опции
tileColor: _selectedIndex == index ? Colors.blue[100] : null,
onTap: () {
setState(() {
_selectedIndex = index;
});
},
);
},
),
);
}
}
void main() => runApp(MaterialApp(home: OptionSelection()));
Объяснение:
-
Управление состоянием с помощью
setState
:
Мы используем переменную_selectedIndex
, чтобы хранить индекс выбранного элемента. Когда пользователь нажимает на опцию,onTap
обновляет_selectedIndex
. -
ListView и ListTile:
Мы используемListView.builder
для создания прокручиваемого списка опций. В каждом элементе списка используется виджетListTile
для отображения текста. -
Выделение выбранной опции:
Мы применяем свойствоtileColor
вListTile
, чтобы изменить цвет фона выбранной опции на основе значения_selectedIndex
.
Результат:
Когда вы нажимаете на опцию, она выделяется цветом фона, показывая, что она выбрана.
Этот пример можно настроить дальше, добавив анимацию или используя более сложные подходы к управлению состоянием, если потребуется.