如何将数据从底部工作表发送到父小部件?
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 不返回任何内容以上是关于如何将数据从底部工作表发送到父小部件?的主要内容,如果未能解决你的问题,请参考以下文章