在Flatter中使用文本表单搜索数据库(SQLite)
我试图搜索我的sqlite数据库,现在它返回所有成员,即使文本被输入到文本表单中。我在memberList构造函数中有一个ListView生成器,它为每个成员创建卡片。我希望它只显示与用户输入匹配的卡片 i、 e.如果用户输入J,则仅显示名字或姓氏中带有字母J的成员 我可以看到查询工作正常,因为我让它在dbHelper类中打印计数,并且每次更改textform的文本时它都会更新。我需要它做的基本上是在改变textform的文本时刷新脚手架的主体,这不起作用 有没有关于我如何做到这一点的建议 如果可能的话,我更喜欢在appbar中使用textform。 下面是我的代码:在Flatter中使用文本表单搜索数据库(SQLite),sqlite,flutter,dart,future,Sqlite,Flutter,Dart,Future,我试图搜索我的sqlite数据库,现在它返回所有成员,即使文本被输入到文本表单中。我在memberList构造函数中有一个ListView生成器,它为每个成员创建卡片。我希望它只显示与用户输入匹配的卡片 i、 e.如果用户输入J,则仅显示名字或姓氏中带有字母J的成员 我可以看到查询工作正常,因为我让它在dbHelper类中打印计数,并且每次更改textform的文本时它都会更新。我需要它做的基本上是在改变textform的文本时刷新脚手架的主体,这不起作用 有没有关于我如何做到这一点的建议 如果
import 'package:flutter/material.dart';
import 'package:troop_mobile_app/MemberFiles/Member.dart';
import 'package:troop_mobile_app/MemberFiles/MemberList.dart';
import 'package:troop_mobile_app/DatabaseFiles/DBHelper.dart';
Future<List<Member>> search(String search) async {
var dbHelper = DBHelper();
Future<List<Member>> members = dbHelper.searchScouts(search);
return members;
}
class SearchFunction extends StatefulWidget {
@override
_SearchFunctionState createState() => _SearchFunctionState();
}
class _SearchFunctionState extends State<SearchFunction> {
TextEditingController controller = TextEditingController();
String searchText = "";
_searchResults(String text) {
return new FutureBuilder<List<Member>>(
future: search(text),
builder: (context, snapshot) {
if (snapshot.hasData) {
return MemberList(snapshot.data);
}
return Container(
alignment: AlignmentDirectional.center,
child: new CircularProgressIndicator(
strokeWidth: 7,
));
});
}
Widget build(BuildContext context) {
//Page Creation returning the UI Home Page Display
return Scaffold(
//Top 'Menu Bar' (AppBar) Creation
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
padding: EdgeInsets.fromLTRB(
20 /*left*/, 0 /*top*/, 20 /*right*/, 0 /*bottom*/),
),
title: TextField(
//initialValue: 'Search...',
style: TextStyle(color: Colors.black),
decoration: InputDecoration(
//fillColor: Colors.white,
//filled: true,
//border:
//OutlineInputBorder(borderRadius: BorderRadius.circular(12.0)),
labelText: 'Search...',
contentPadding: EdgeInsets.fromLTRB(10, 6, 0, 6),
prefixIcon: Icon(Icons.search),
),
onChanged: (text) async {
_searchResults(text);
searchText = text;
},
controller: controller,
),
),
//End Top 'Menu Bar' Creation
//Main Body Creation
body: Container(
child: new FutureBuilder<List<Member>> (
future: search(searchText),
builder: (context, snapshot) {
if (snapshot.hasData) {
return MemberList(snapshot.data);
}
return Container(
alignment: AlignmentDirectional.center,
child: new CircularProgressIndicator(
strokeWidth: 7,
));
}),
)
//End Main Body Creation
);
}
}
进口“包装:颤振/材料.省道”;
导入“package:force_mobile_app/MemberFiles/Member.dart”;
导入“package:force_mobile_app/MemberFiles/MemberList.dart”;
导入“package:force_mobile_app/DatabaseFiles/DBHelper.dart”;
未来搜索(字符串搜索)异步{
var dbHelper=dbHelper();
未来成员=dbHelper.searchScouts(搜索);
返回成员;
}
类SearchFunction扩展StatefulWidget{
@凌驾
_SearchFunctionState createState()=>\u SearchFunctionState();
}
类_SearchFunctionState扩展状态{
TextEditingController=TextEditingController();
字符串searchText=“”;
_搜索结果(字符串文本){
返回新的FutureBuilder(
未来:搜索(文本),
生成器:(上下文,快照){
if(snapshot.hasData){
返回成员列表(snapshot.data);
}
返回容器(
对齐:对齐方向.center,
儿童:新的循环压缩机指示器(
冲程宽度:7,
));
});
}
小部件构建(构建上下文){
//返回UI主页显示的页面创建
返回脚手架(
//顶部“菜单栏”(应用程序栏)创建
appBar:appBar(
领先:IconButton(
图标:图标(图标。箭头返回),
已按下:(){
Navigator.pop(上下文);
},
填充:EdgeInsets.fromLTRB(
20/*左*/,0/*上*/,20/*右*/,0/*下*/),
),
标题:文本字段(
//initialValue:'搜索…',
样式:TextStyle(颜色:Colors.black),
装饰:输入装饰(
//fillColor:Colors.white,
//是的,
//边界:
//OutlineInputBorder(borderRadius:borderRadius.circular(12.0)),
labelText:“搜索…”,
contentPadding:EdgeInsets.fromLTRB(10,6,0,6),
前缀:图标(Icons.search),
),
onChanged:(文本)异步{
_搜索结果(文本);
searchText=文本;
},
控制器:控制器,
),
),
//结束顶部“菜单栏”的创建
//主体创造
主体:容器(
孩子:新未来建设者(
未来:搜索(searchText),
生成器:(上下文,快照){
if(snapshot.hasData){
返回成员列表(snapshot.data);
}
返回容器(
对齐:对齐方向.center,
儿童:新的循环压缩机指示器(
冲程宽度:7,
));
}),
)
//终端主体创建
);
}
}
成员名单:
import 'package:flutter/material.dart';
import 'MemberCards.dart';
import 'package:troop_mobile_app/MemberFiles/Member.dart';
class MemberList extends StatelessWidget {
final List<Member> members;
MemberList(this.members);
@override
Widget build(BuildContext context) {
return _buildList(context);
}
ListView _buildList(context) {
return ListView.builder(
itemCount: members.length,
itemBuilder: (context, int) {
return MemberCards(members[int], );
},
);
}
}
导入“包装:颤振/材料.省道”;
导入“MemberCards.dart”;
导入“package:force_mobile_app/MemberFiles/Member.dart”;
类MemberList扩展了无状态小部件{
最后成员名单;
成员名单(此为成员);
@凌驾
小部件构建(构建上下文){
返回构建列表(上下文);
}
ListView\u构建列表(上下文){
返回ListView.builder(
itemCount:members.length,
itemBuilder:(上下文,int){
返回会员卡(会员[int],);
},
);
}
}
DBHelper:
Future<List<Map<String, dynamic>>> searchScoutsMap(String search) async {
Database db = await this.database;
print("This works? $db");
var result = await db.rawQuery("SELECT * FROM $memberTable WHERE adult = 'N' AND ($colFirstName Like '%$search%' OR $colLastName Like '%$search%') ORDER BY $colFirstName ASC, $colLastName ASC");
print("result is working? $result");
print(result.length);
return result;
}
Future<List<Member>> searchScouts(String search) async {
var searchResults = await searchScoutsMap(search); // Get 'Map List' from database
print(searchResults.length);
print(searchResults.toString());
int count = searchResults.length; // Count the number of map entries in db table
List<Member> memberList = List<Member>();
// For loop to create a 'Member List' from a 'Map List'
for (int i = 0; i < count; i++) {
print("for loop working: ${i+1}");
memberList.add(Member.fromMapObject(searchResults[i]));
}
print("completed for loop");
return memberList;
}
Future searchScoutsMap(字符串搜索)异步{
Database db=等待此数据库;
打印(“本工程?$db”);
var result=await db.rawQuery(“从$memberTable中选择*,其中成人='N'和($colFirstName类似“%$search%”或$colLastName类似“%$search%”)按$colFirstName ASC、$colLastName ASC排序”);
打印(“结果有效?$result”);
打印(结果长度);
返回结果;
}
未来搜索搜索(字符串搜索)异步{
var searchResults=await searchScoutsMap(搜索);//从数据库获取“地图列表”
打印(searchResults.length);
打印(searchResults.toString());
int count=searchResults.length;//计算数据库表中的映射条目数
List memberList=List();
//For循环从“映射列表”创建“成员列表”
for(int i=0;i
经过数小时令人沮丧的工作,我终于解决了我的错误
以下是我的解决方案:
在第一个代码片段中,我缺少setState()
我得把新的FutureBuilder包装好。。。使用setState()
\u搜索结果(字符串文本){
返回新的FutureBuilder(
未来:搜索(文本),
生成器:(上下文,快照){
if(snapshot.hasData){
返回成员列表(snapshot.data);
}
返回容器(
对齐:对齐方向.center,
儿童:新的循环压缩机指示器(
_searchResults(String text) {
return new FutureBuilder<List<Member>>(
future: search(text),
builder: (context, snapshot) {
if (snapshot.hasData) {
return MemberList(snapshot.data);
}
return Container(
alignment: AlignmentDirectional.center,
child: new CircularProgressIndicator(
strokeWidth: 7,
));
});
}
_searchResults(String text) {
setState(() {
return new FutureBuilder<List<Member>>(
future: search(text),
builder: (context, snapshot) {
if (snapshot.hasData) {
return MemberList(snapshot.data);
}
return Container(
alignment: AlignmentDirectional.center,
child: new CircularProgressIndicator(
strokeWidth: 7,
));
});
});
}