如何解决按下图标时不会重新加载自定义小部件
我已经在 flutter 工作了几个月,我正在尝试在我的应用程序中实现一个搜索功能。我有一个名为 list_product
的自定义小部件,它接受 uri 和数据作为参数并返回一个 gridview 作为产品卡它第一次工作正常,但是当我尝试更改第二次查询时它不起作用,请任何人帮助解决此问题
这是我的自定义小部件
import 'package:flutter/material.dart';
import 'package:need/user/product_details.dart';
import 'package:need/models.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:need/shop/product%20_detail_shop.dart';
import '../credentials.dart';
class list_products extends StatefulWidget {
String serverUri;
var serverData;
String needId;
String from;
list_products({
Key key,@required this.serverUri,@required this.serverData,this.needId,this.from,}) : super(key: key);
list_product createState() => list_product();
}
class list_product extends State<list_products>
with AutomaticKeepAliveClientMixin {
Future<List<Product>> products;
@override
void initState() {
super.initState();
products = _fetchProduct();
}
Future<List<Product>> _fetchProduct() async {
print(widget.serverUri);
print(widget.serverData);
//json encode
String body = json.encode(widget.serverData);
var response = await http.post(widget.serverUri,headers: <String,String>{
'Content-Type': 'application/json; charset=UTF-8',},body: body);
print("############################");
print(response.body);
if (response.statusCode == 200) {
final items = json.decode(response.body).cast<Map<String,dynamic>>();
List<Product> listOfProduct = items.map<Product>((json) {
return Product.fromJson(json);
}).toList();
return listOfProduct;
} else {
throw Exception('Failed to load internet');
}
}
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
super.build(context);
return Container(
child: FutureBuilder<List<Product>>(
future: products,builder: (context,snapshot) {
// if (snapshot.hasError) return Text('error ${snapshot.error}');
if (!snapshot.hasData)
return Center(child: CircularProgressIndicator());
return GridView.count(
crossAxisCount: 2,childAspectRatio: (160 / 192),crossAxisSpacing: 1.0,mainAxisSpacing: 1.0,shrinkWrap: true,children: snapshot.data.map((product) {
String price = product.price.toString(); //typeCastinng
return Padding(
padding: const EdgeInsets.all(1.0),child: new InkWell(
onTap: () {}
},child: Card(
color: Theme.of(context).colorScheme.surface,child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
Container(
height: 160,width: 160,child: Container(
color: Colors.grey,child: Image(
image: NetworkImage(product.photo),fit: BoxFit.fill),)),ListTile(
dense: true,contentPadding: EdgeInsets.only(
left: 5.0,right: 5.0,top: 0.0,bottom: 0.0),visualDensity:
VisualDensity(horizontal: 0,vertical: -4),title: Text(product.title,style: TextStyle(
color: Theme.of(context)
.colorScheme
.onSurface,fontSize: 15,fontWeight: FontWeight.w400),overflow: TextOverflow.visible),trailing: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),color: Colors.greenAccent,),padding:
const EdgeInsets.fromLTRB(6,4,6,4),child: Text(
'\u{20B9}' + price,style: TextStyle(
color: Colors.black,fontWeight: FontWeight.w500),)
])),));
}).toList(),);
},));
}
}
这是我的搜索页面
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../credentials.dart';
import '../models.dart';
import '../widgets/gridview_product.dart';
class Search extends StatefulWidget {
const Search({Key key}) : super(key: key);
@override
_SearchState createState() => _SearchState();
}
class _SearchState extends State<Search> {
final controller = TextEditingController();
String uuri;
var data;
Future<List<Product>> _fetchProduct() async {
String query = controller.text;
final String uri = '$domain/user/search/product/$query';
var response = await http.get(uri,String>{
'Content-Type': 'application/json; charset=UTF-8',});
if (response.statusCode == 200) {
final items = json.decode(response.body).cast<Map<String,dynamic>>();
List<Product> listOfProduct = items.map<Product>((json) {
return Product.fromJson(json);
}).toList();
return listOfProduct;
} else {
throw Exception('Failed to load internet');
}
}
// Widget _buildsearch() {
// return list_products(server_uri: uuri,server_data: data);
// }
Widget display = Center(child: Text("Search"));
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,appBar: AppBar(
toolbarHeight: 90,title: Form(
key: _formKey,child: TextFormField(
autofocus: true,controller: controller,textInputAction: TextInputAction.search,decoration: InputDecoration(
hintText: "Search",validator: (value) {
if (value.isEmpty) {
return 'Enter your interest';
}
return null;
},actions: <Widget>[
IconButton(
onPressed: () {
if (_formKey.currentState.validate()) {
setState(() {
String query = controller.text;
uuri = '$domain/user/search/product';
data = {"query": query};
display = list_products(
serverUri: uuri,serverData: data,from: "user");
});
}
},icon: Icon(Icons.search),],body: Container(child: display));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。