我如何得到一个带有文本的黑色横幅动态显示取决于什么用户在另一个屏幕上做的扑动?



我面临的挑战是,当用户在另一个屏幕上订购商品时,从同一选项卡上的屏幕返回时,要显示黑色横幅。只有当用户选择另一个选项卡离开然后返回屏幕时,下面的当前代码才能适当地显示黑色横幅。我需要动态呈现的部分以"if (orderprovider . listdersummary . isnotempty)"开始。我相信这涉及到使无状态小部件有状态,但这会导致错误,表明这可能不是正确的方法。

class GridItems extends StatelessWidget {
GridItems({@required this.infinityPageController});
final InfinityPageController infinityPageController;
@override
Widget build(BuildContext context) {
final List<Item> itemList = Provider.of<List<Item>>(context);
if (itemList == null) {
return Center(
child: CupertinoActivityIndicator(
radius: 20,
),
);
}
final List<Item> mapItemList = itemList.toList();
return Column(
children: <Widget>[
TopMenuNavigation(
infinityPageController: infinityPageController,
title: 'ALL ITEMS',
),
Divider(
color: Colors.grey,
),
Expanded(
child: GridView.builder(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemCount: itemList.length,
itemBuilder: (BuildContext contex, int index) {
return Center(
child: InkWell(
onTap: () {
Navigator.of(context)
.pushNamed('/order', arguments: mapItemList[index]);
},
child: Container(
width: 310,
margin: EdgeInsets.all(7),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1, color: Colors.grey),
borderRadius: BorderRadius.all(
Radius.circular(7.0),
),
),
child: Column(
children: <Widget>[
Container(
padding: EdgeInsets.only(left: 10, top: 10),
width: double.infinity,
child: Text('${mapItemList[index].itemName}'),
),
Expanded(
child: Image.network(
'${mapItemList[index].imageUrl}',
),
),
],
),
),
),
);
},
),
),
if (OrderProvider.listOrderSummary.isNotEmpty)
GestureDetector(
onTap: () {
Navigator.of(context).pushNamed('/review_order');
},
child: Container(
height: 55,
color: Colors.black,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Spacer(),
Text(
'REVIEW ORDER (${OrderProvider.listOrderSummary.length} items)',
style: TextStyle(
fontSize: 17,
color: Colors.white,
fontFamily: 'OpenSans',
fontWeight: FontWeight.bold),
),
SizedBox(width: 8),
Icon(
Icons.navigate_next,
color: Colors.white,
size: 35,
),
SizedBox(
width: MediaQuery.of(context).size.height * 0.065,
),
],
),
),
)
else
SizedBox(),
],
);
}
}

您必须以某种方式重建您想要返回的屏幕(或它的一部分)。这就是状态管理解决方案应该发挥作用的地方:)。

创建BLoC或ValueNotifier,并使用StreamBuilderValueListenableBuilder重新构建小部件。如果您想让它变得简单,只需在选项卡屏幕之间的有状态小部件中创建一个共享状态,并在黑色横幅出现时调用setState

相关内容

最新更新