如何将数据从底部工作表发送到父小部件?

Posted

技术标签:

【中文标题】如何将数据从底部工作表发送到父小部件?【英文标题】:How can I send data from bottom sheet to parent widget? 【发布时间】:2021-12-19 13:02:26 【问题描述】:

我在底部工作表中有产品列表,当我选择要添加到父小部件的任何产品时,不幸的是我的产品仅在热重新加载后添加,或者当我创建从底部工作表到父小部件的新路线时,如何我可以解决这个问题,有什么想法吗?这是底部工作表代码的一部分

    class IceBottomSheet extends StatefulWidget 


  const IceBottomSheet(Key? key) : super(key: key);

  @override
  _IceBottomSheetState createState() => _IceBottomSheetState();


class _IceBottomSheetState extends State<IceBottomSheet> 
  final _model = ProductWidgetsModel();
  @override
  Widget build(BuildContext context) 
    List<Widget> productWidgetList = [];

    products.forEach((product) =>
        productWidgetList.add(SingleProductWidget(product: product)));

    return Provider(
      model: _model,
      child: Expanded(
        child: GridView.count(
          crossAxisSpacing: 10,
          mainAxisSpacing: 16,
          shrinkWrap: true,
          
          crossAxisCount: 2, children: productWidgetList),
      ),
    );
  



class SingleProductWidget extends StatefulWidget 
  final Product product;

  
  const SingleProductWidget(Key? key, required this.product)
      : super(key: key);

  @override
  State<SingleProductWidget> createState() => _SingleProductWidgetState();


class _SingleProductWidgetState extends State<SingleProductWidget> 
  
  @override
  Widget build(BuildContext context) 
    final model = Provider.of(context)?.model;

    return Padding(
      padding: const EdgeInsets.all(5.0),
      child: 
      Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          SizedBox(
            width: double.infinity,
            height: 100,
            child: DecoratedBox(
              decoration: BoxDecoration(
               
                image: DecorationImage(
                  
                  image: widget.product.image,
                ),
                shape: BoxShape.circle,
                border: Border.all(
                  color: model?.idSelected == widget.product.id
                      ? Colors.yellow
                      : Colors.grey,
                  width: 5.0,
                  style: BorderStyle.solid,
                ),
              ),
              child: GestureDetector(
                onTap: () 
                model?.idSelected = widget.product.id;
              //   Route route =
              //     MaterialPageRoute(builder: (context) => BerryPage(context,));
              // Navigator.push(context, route);
              if(model?.idSelected == 1)

                  menuRow.removeAt(2);
                  Navigator.pop(context);
                  choice.insert(2, Adds(id: 102, name: 'Холодок', img: 'https://autogear.ru/misc/i/gallery/73434/2759438.jpg'));

              
              
              ),
            ),
          ),

这里是父部件的部分代码,在 GestureDetector 里面

  else if (index == 2)
                setState(() 
                  
                );
                showModalBottomSheet(
                  
                  
    context: context,
    isScrollControlled: true,
    builder: (BuildContext builder) 
      return Container(
          height: 250,
          child: Column(
            children: [
              SizedBox(
                height: 10,
              ),Row(
                children: [
                Padding(
                  padding: EdgeInsets.only(left: MediaQuery.of(context).size.width*0.25 + MediaQuery.of(context).size.width *0.12),
                  child: Text(
                    'Холодок',
                    style: TextStyle(
                      fontFamily: 'Newfont',
                      fontSize: 22,
                    ),
                                    ),
                ),
                SizedBox(width: MediaQuery.of(context).size.width*0.25,),
                
                IconButton(icon: Icon(Icons.close),onPressed: ()Navigator.pop(context);,)
              ],
              ),
              
              Divider(),
               IceBottomSheet(),
            ],
          ));
    ,
  );

【问题讨论】:

【参考方案1】:

所以当你打开BottomSheet时你必须在它前面加上await,所以当你调用Navigator.pop(context, data_you_want_to_pass_to_parent)时它会等待一些数据返回。

final data = await openBottomSheet();

当你想关闭时,在bottomSheet中,只需传递所需的数据

Navigator.pop(context, data_you_want_to_pass_to_parent);

【讨论】:

***.com/users/13742810/m-m-hasibuzzaman,所以当我执行 Navigator.pop(context,choice.insert(...)) 时会出现错误,例如 insert 是 void 类型,所以我无法发送数据需要( choice.insert(...) 这是一个返回类型为 void 的函数,但导航器返回数据参数需要一个数据,因此它会抛出错误,因为 void 不返回任何内容

以上是关于如何将数据从底部工作表发送到父小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Flutter 中的子小部件调用父小部件功能

在子小部件中,如何在 kivy 中获取父小部件的实例

Flutter - 无法从父小部件更改子状态

如何布局 GridView.count 以便小部件从 Flutter 中的父小部件顶部开始构建?

如何将父小部件焦点重定向到子小部件?

如何在 Qt 中将消息从子窗口小部件发送到父窗口?