Untitled
unknown
plain_text
a year ago
3.7 kB
9
Indexable
import 'package:flutter/material.dart';
import '../../../../utils/logger.dart';
class ModalBottomSheetWidget extends StatefulWidget {
final String title;
final List<BottomSheetModel> items;
final bool isEnableSearch;
const ModalBottomSheetWidget({
super.key,
required this.title,
required this.items,
this.isEnableSearch = false,
});
@override
State<ModalBottomSheetWidget> createState() => _ModalBottomSheetWidgetState();
}
class _ModalBottomSheetWidgetState extends State<ModalBottomSheetWidget> {
final TextEditingController _searchController = TextEditingController();
List<BottomSheetModel> _filteredItems = [];
@override
void initState() {
super.initState();
_filteredItems = widget.items;
_searchController.addListener(_filterItems);
}
@override
void dispose() {
_searchController.removeListener(_filterItems);
_searchController.dispose();
super.dispose();
}
void _filterItems() {
final query = _searchController.text.toLowerCase();
setState(() {
_filteredItems = widget.items.where((item) {
return item.valueForDisplay.toLowerCase().contains(query);
}).toList();
});
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
logger.i("Constr Height ===> ${constraints.maxHeight}");
return Container(
constraints: widget.isEnableSearch == true
? BoxConstraints(maxHeight: constraints.maxHeight * 0.95, minHeight: constraints.maxHeight * 0.95)
: BoxConstraints(maxHeight: constraints.maxHeight * 0.95),
padding: const EdgeInsets.all(16.0),
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_buildHeaderSticky(widget.title),
if (widget.isEnableSearch) _buildSearchBar(),
const Divider(),
// Wrap the ListView in Flexible
Flexible(
child: ListView.builder(
shrinkWrap: true,
itemCount: _filteredItems.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_filteredItems[index].valueForDisplay),
onTap: () {
Navigator.pop(context);
},
);
},
),
),
],
),
);
},
);
}
Widget _buildHeaderSticky(String title) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 16.0),
width: double.infinity,
child: Text(
title,
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
);
}
Widget _buildSearchBar() {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextField(
controller: _searchController,
decoration: const InputDecoration(
hintText: 'Search...',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.search),
),
onChanged: (value) => _filterItems(),
),
);
}
}
class BottomSheetModel {
final String valueEn;
final String valueTh;
String get valueForDisplay => valueEn;
BottomSheetModel({
required this.valueEn,
required this.valueTh,
});
}
Editor is loading...
Leave a Comment