【问题标题】: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(),
            ],
          ));
    },
  );

【问题讨论】:

    标签: flutter dart button callback widget


    【解决方案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);
    

    【讨论】:

    • stackoverflow.com/users/13742810/m-m-hasibuzzaman,所以当我执行 Navigator.pop(context,choice.insert(...)) 时会出现错误,例如 insert 是 void 类型,所以我无法发送数据需要(
    • choice.insert(...) 这是一个返回类型为 void 的函数,但导航器返回数据参数需要一个数据,因此它会抛出错误,因为 void 不返回任何内容
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2018-09-24
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多