Flutter 中使用 Provider 包的过滤屏幕

问题描述 投票:0回答:1

我是 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)))
        ]),
      ),
    );
  }
}

 Filter screen

我需要一种情况,当用户按以下顺序单击任何选项时:

  • 优惠栏
  • 交货时间栏
  • 定价栏
  • 评分栏
  • 最后单击“过滤器”按钮,它将打开一个单独的页面或屏幕。
flutter flutter-dependencies flutter-design
1个回答
0
投票

好吧,首先你需要在这个小部件之上添加至少一个提供者(上面我的意思是包装这个小部件的小部件

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>
来获取用户界面更新。

© www.soinside.com 2019 - 2024. All rights reserved.