我是 Flutter 新手,我能够创建 UI,但我不是专家。我一直在寻找一种使用 Provider 创建过滤器屏幕的方法。有谁可以帮忙吗?
这是我的代码:我正在使用对话框小部件来创建弹出窗口。
class _FilterDialogWidgetState extends State<FilterDialogWidget> {
@override
Widget build(BuildContext context) {
return Dialog(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 15, vertical: 15),
height: 659,
width: 0,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
),
child: Column(children: [
Row(children: [
const Text(
'Filter your search',
style: TextStyle(color: Color(0xFF181C2E), fontSize: 16),
),
const SizedBox(width: 60),
Padding(
padding: const EdgeInsets.only(left: 18),
child: Container(
height: 45,
width: 45,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: const Color(0xFFECF0F4),
),
child: const Icon(Icons.clear)),
),
]),
const SizedBox(height: 10),
SizedBox(
height: 130,
width: 291,
child:
// Here is the offers column
Column(children: [
const Padding(
padding: EdgeInsets.only(right: 200, bottom: 10),
child: Text(
'OFFERS',
style: TextStyle(color: Color(0xFF181C2E), fontSize: 12),
),
),
Row(children: [
// delivery container or
Container(
width: 82,
height: 46,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'Delivery',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF464E57),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
const SizedBox(
width: 5,
),
Container(
// or pick up container
width: 80,
height: 46,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'Pick up',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF181C2E),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
const SizedBox(
width: 5,
),
Container(
// or offers container
width: 78,
height: 46,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'Offer',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF181C2E),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
]),
const SizedBox(
height: 10,
),
Padding(
padding: const EdgeInsets.only(right: 34),
child:
// or online payment available container
Container(
width: 219,
height: 45.96,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'Online payment available',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF181C2E),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
),
])),
const SizedBox(
height: 25,
),
const Padding(
padding: EdgeInsets.only(right: 169, bottom: 10),
child:
// And then Click on any option on
//children of Delivery-Time
Text(
'DELIVERY-TIME',
style: TextStyle(color: Color(0xFF181C2E), fontSize: 12),
),
),
Row(children: [
Container(
// First Container with 10-15 min
width: 86,
height: 46,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'10-15 min',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF464E57),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
const SizedBox(
width: 4,
),
Container(
// First Container with 20 min
width: 80,
height: 46,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'20 min',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF181C2E),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
const SizedBox(
width: 5,
),
Container(
// First Container with 30 min
width: 75,
height: 46,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(33)),
border: Border.all(
width: 2.0,
color: const Color(0xFFEDEDED),
style: BorderStyle.solid),
),
child: const Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
'30 min',
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF181C2E),
fontSize: 14,
fontFamily: 'Sen',
),
),
),
),
]),
const SizedBox(
height: 25,
),
const Padding(
padding: EdgeInsets.only(right: 200, bottom: 10),
child:
// And then Click on any option on
//Pricing children
Text(
'PRICING',
style: TextStyle(color: Color(0xFF181C2E), fontSize: 12),
),
),
Row(children: [
// FIRST PRICE
Container(
alignment: Alignment.center,
width: 48,
height: 48,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: Color(0XFFEDEDED),
width: 2,
),
),
child: Text(
'\$',
style: TextStyle(),
),
),
SizedBox(width: 5),
// SECOND PRICE
Container(
alignment: Alignment.center,
width: 48,
height: 48,
decoration: BoxDecoration(
color: Colors.orange,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: Color(0XFFEDEDED),
width: 2,
),
),
child: Text(
'\$\$',
style: TextStyle(
color: Colors.white,
),
),
),
SizedBox(width: 5),
// THIRD PRICE
Container(
alignment: Alignment.center,
width: 48,
height: 48,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: const Color(0XFFEDEDED),
width: 2,
),
),
child: const Text(
'\$\$\$',
style: TextStyle(),
),
),
]),
const SizedBox(
height: 25,
),
// And then Click on any option on
// Rating Children
const Padding(
padding: EdgeInsets.only(right: 200, bottom: 10),
child: Text(
'RATING',
style: TextStyle(color: Color(0xFF181C2E), fontSize: 12),
),
),
Row(children: [
Container(
// 1 Star Rating
alignment: Alignment.center,
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: const Color(0XFFEDEDED),
width: 2,
),
),
child: const Icon(Icons.star, color: Colors.orange)),
const SizedBox(
width: 5,
),
// 2 Star Rating
Container(
alignment: Alignment.center,
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: const Color(0XFFEDEDED),
width: 2,
),
),
child: const Icon(Icons.star, color: Colors.orange)),
const SizedBox(
width: 5,
),
// 3 Star Rating
Container(
alignment: Alignment.center,
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: const Color(0XFFEDEDED),
width: 2,
),
),
child: const Icon(Icons.star, color: Colors.orange)),
const SizedBox(
width: 5,
),
Container(
// 4 Star Ratin
alignment: Alignment.center,
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: Color(0XFFEDEDED),
width: 2,
),
),
child: const Icon(Icons.star, color: Colors.orange)),
const SizedBox(
width: 5,
),
// 5 Star Rating
Container(
alignment: Alignment.center,
width: 40,
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(25),
border: Border.all(
color: const Color(0XFFEDEDED),
width: 2,
),
),
child: const Icon(Icons.star_border_outlined,
color: Color(0xFFD9D9D9))),
]),
const SizedBox(
height: 25,
),
// AND FINALLY CLICKED ON THIS ELEVATED BUTTON
ElevatedButton(
style: buttonPrimary2,
onPressed: () {},
child:
const Text('FILTER', style: TextStyle(color: Colors.white)))
]),
),
);
}
}
我需要一种情况,当用户按以下顺序单击任何选项时:
好吧,首先你需要在这个小部件之上添加至少一个提供者(上面我的意思是包装这个小部件的小部件
Parent(child: ChildWidget())
。
你这样做的方式是这样的:
ChangeNotifierProvider.value(
value: MyFilterProvider()
child: const FilterDialogWidget(),
),
来自 [provider package][1] 然后你可以像这样创建你的
MyFilterProvider
class MyFilterProvider extends ChangeNotifier{
List<String> filters =[];
addFilter(String filter) {
//do add
}
removeFilter(String filter){
//do remove
}
}
在您的用户界面中,您可以使用提供程序来了解哪个过滤器处于活动状态,如下所示:
Provider.of<MyFilterProvider>(context).filters.contains(myFilter)
你可以像这样改变你的过滤器
Provider.of<MyFilterProvider>(context).addFilter(newFilter);
最后不要忘记使用
ConsumerWidget<MyFilterProvider>
来获取用户界面更新。