Поиск в базе данных (SQLite) с использованием текстовой формы во Flutter - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь выполнить поиск в моей базе данных sqlite, сейчас она возвращает всех участников, даже когда текст вводится в текстовую форму. У меня есть конструктор ListView в конструкторе memberList, который создает карты для каждого члена. То, что я хочу сделать, это отображать только карты, которые соответствуют вводу пользователя.

т.е. если пользователь введет J, он покажет только те элементы, которые имеют либо имя, либо фамилию с буквами J.

Я вижу, что запрос работает правильно, так как он печатает считать в классе dbHelper, и он обновляется каждый раз, когда я изменяю текст текстовой формы. Что мне нужно сделать, это по существу обновить sh тело Scaffold onChange текста текстовой формы, которое не работает.

Любые предложения о том, как я могу это сделать?

I предпочитаю иметь текстовую форму в панели приложений, если это вообще возможно. Ниже мой код:


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


        );
  }
}

MemberList:

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], );
      },
    );
  }
}

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;

  }

1 Ответ

0 голосов
/ 14 апреля 2020

Я смог исправить свою ошибку после нескольких часов безумной работы ...

Вот мое исправление:

В первом фрагменте кода мне не хватало setState ( )

Мне пришлось обернуть возвращаемый новый FutureBuilder ... setState ()

_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,
                ));
          });
    });
  }
...