在我的应用中,当我使用BottomNavigationBarItem(参见Home小部件)时,FutureBuilder可以正常工作。
但是,当我使用Navigator.push和Navigator.pop时,未触发FutureBuilder。
我不明白为什么,任何帮助将不胜感激。 吼叫我的代码。
Home widget
import 'package:com.pro.cocotal.online/models/product.dart';
import 'package:com.pro.cocotal.online/models/user.dart';
import 'package:com.pro.cocotal.online/screens/home/products/productListScreen.dart';
import 'package:com.pro.cocotal.online/screens/home/shopSettings/shopSettings.dart';
import 'package:flutter/material.dart';
class Home extends StatefulWidget {
final User user;
final List<Product> products;
Home(this.user, this.products);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int _selectedIndex = 0;
List<Widget> _widgetOptions;
@override
void initState(){
_widgetOptions = <Widget>[
ProductListScreen(widget.user, widget.products),
ShopSettings(widget.user),
];
}
//navigue dans les menus
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body:Center(
child: Scaffold(
body:_widgetOptions.elementAt(_selectedIndex),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
title: Text(''),
icon: Icon(Icons.home, color: Colors.blueAccent, size: 35),
),
BottomNavigationBarItem(
title: Text(''),
icon: Icon(Icons.settings, color: Colors.blueAccent, size: 35)
)
],
currentIndex: _selectedIndex,
selectedItemColor: Colors.amber[800],
onTap: _onItemTapped,
),
),
)
);
}
}
ProductListScreen类
import 'package:com.pro.cocotal.online/models/product.dart';
import 'package:com.pro.cocotal.online/models/user.dart';
import 'package:com.pro.cocotal.online/screens/home/products/addProductScreen.dart';
import 'package:com.pro.cocotal.online/screens/home/products/productScreen.dart';
import 'package:com.pro.cocotal.online/services/productService.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
class ProductListScreen extends StatefulWidget {
final List<Product> products;
final User user;
ProductListScreen(this.user, this.products);
@override
_ProductsState createState() => _ProductsState();
}
class _ProductsState extends State<ProductListScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Tienda " + widget.user.storeName),
elevation: 0,
),
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Expanded(
child: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
backgroundColor: Colors.blue,
expandedHeight: 130,
flexibleSpace: FlexibleSpaceBar(
background: Image.network(
"https://cocotal.online/wp-content/uploads/revslider/cropped-slider-41.jpg",
fit: BoxFit.cover,
),
),
),
FutureBuilder(
future: ProductService().getProducts(widget.user),
builder: (context, productSnaps){
List<Product> products = productSnaps.data;
if (productSnaps.connectionState != ConnectionState.done) {
return SliverFixedExtentList(
itemExtent: 1,
delegate: SliverChildBuilderDelegate(
(context, i) {
return SpinKitRotatingCircle(
color: Colors.white,
size: 50.0,
);
},
childCount: 1,
),
);
}
if (productSnaps.hasData == null) {
return SliverFixedExtentList(
itemExtent: 0,
delegate: SliverChildBuilderDelegate(
(context, i) {
return ListTile(
title: Text("null"),
trailing: Icon(Icons.delete),
onTap: () {
},
);
},
childCount: 1,
),
);
}
return SliverFixedExtentList(
itemExtent: 50,
delegate: SliverChildBuilderDelegate(
(context, i) {
return ListTile(
title: Text(products[i].name),
trailing: Icon(Icons.delete),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => ProductScreen(products[i])));
},
);
},
childCount: products.length,
),
);
},
),
],
),
),
RaisedButton.icon(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => AddProduct()));
},
icon: Icon(Icons.add_circle),
label: Text('Add a product')
),
],
)
);
}
}
ProductScreen类
import 'package:com.pro.cocotal.online/models/product.dart';
import 'package:flutter/material.dart';
class ProductScreen extends StatefulWidget {
final Product product;
const ProductScreen(this.product);
@override
_ProductScreenState createState() => _ProductScreenState();
}
class _ProductScreenState extends State<ProductScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.product.name),
leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: ()async{
Navigator.pop(context);
}),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Row(
children: <Widget>[
Text("Nom : " + widget.product.name),
],
),
Row(
children: <Widget>[
Text("Description : " + widget.product.description),
],
),
Row(
children: <Widget>[
Text("Prix : " + widget.product.price),
],
),
],
),
);
}
}