flutter - 在颤振中使用mysql搜索字段
问题描述
我需要添加一个可以在我的列表中搜索的搜索栏。我不知道该怎么做。我是新来的颤振。谢谢你。
import 'package:flutter/material.dart';
import 'package:http/http.dart'as http;
import 'dart:async';
import 'dart:convert';
import './details.dart';
class WelcomePage extends StatefulWidget {
@override
_WelcomePageState createState() => _WelcomePageState();
}
class _WelcomePageState extends State<WelcomePage> {
Future<List> getData() async{
final response=await http.get("http://192.168.1.112/flutter/listview.php");
return json.decode(response.body);
}
Icon sr=Icon(Icons.search);
Widget build(BuildContext context) {
return Scaffold(
appBar:AppBar(
actions: <Widget>[
IconButton(icon: sr, onPressed: (){})]
),
body: FutureBuilder<List>(
future: getData(),
builder: (ctx,ss){
if(ss.hasError)
{
print("Error");
}
if(ss.hasData)
{
return Items(list:ss.data);
}
else{
return CircularProgressIndicator();
}
}
),
);
}
}
class Items extends StatelessWidget{
List list;
Items({this.list});
@override
Widget build (BuildContext context)
{
return ListView.builder(
itemCount: list==null?0:list.length,
itemBuilder: (ctx,i){
return new Container(
padding : const EdgeInsets.all(10),
child : new Card(
child :ListTile(
leading: Icon(Icons.widgets),
title: Text(list[i]['nom'],style: TextStyle(fontSize:20),),
subtitle: Text(list[i]['etat']) ,
onTap: ()=>Navigator.of(context).push(
MaterialPageRoute(builder: (BuildContext context) =>Details( list,i),
),
)
)
)
);
},
);
}
}
解决方案
这是做你想做的事的基本方法。您只需要将Items
小部件转换为 aStatefulWidget
然后TextField
使用TextEditingController
. 您将能够使用该TextField.onChanged
属性调用setState
并重建使用文本控制器当前值过滤的列表。
class Items extends StatefulWidget {
final List list;
Items({@required this.list});
@override
_ItemsState createState() => _ItemsState();
}
class _ItemsState extends State<Items> {
final _controller = TextEditingController();
@override
Widget build(BuildContext context) {
List filteredList = [];
if (_controller.text != null && _controller.text.isNotEmpty) {
widget.list.forEach((item) {
if (item.toString().toLowerCase().contains(_controller.text.toLowerCase()))
filteredList.add(item);
});
} else
filteredList = widget.list;
return Column(children: <Widget>[
TextField(controller: _controller, onChanged: (text) => setState(() {})),
Expanded(
child: ListView.builder(
itemCount: filteredList.length,
itemBuilder: (context, index) {
return ListTile(title: Text(filteredList[index].toString()));
}),
),
]);
}
}
推荐阅读
- jenkins - 从其他应用程序访问 jenkins 构建工件
- c++ - C ++ libcurl返回null?
- c - C语言中的时间转换
- docker-compose - 如何使用引导模式的撰写文件在 Docker 中运行 mysql 路由器
- html - 为什么没有缓存的元标记在网站中不起作用,而 HTML 页面从缓存中加载?
- javascript - 具有动态属性的Vue3重定向
- spring-boot - 如何使用 spring-boot:build-image 嵌入 CA 证书?
- apache-kafka - 如何在 kafka sink 连接器中设置特定表?
- cadence-workflow - 对于循环调用的活动,该活动的重试策略是否适用于每次运行?
- elasticsearch - 是否可以使用 bucket_script 计算每个桶的百分比?