【问题标题】:I dont want to display all the records of table in listview but I want to display records of only particular customer in flutter我不想在列表视图中显示表的所有记录,但我想在颤动中仅显示特定客户的记录
【发布时间】:2021-07-31 12:21:22
【问题描述】:

我有一个使用 listview 显示客户列表的屏幕。接下来,当我单击客户时,我想在列表视图的下一个屏幕中仅显示该特定客户(customerId)的注释(记录)。我知道如何显示表格的所有记录。但如何只显示某些记录?既没有任何错误,也没有显示列表视图。我不知道我哪里错了。

 List<CustomerNote> cnoteList;
      int count = 0;
       if (cnoteList == null) {
      cnoteList = List<CustomerNote>();
      updateCustomerNotes();
    }

db_service.dart

    Future<List<CustomerNote>> getCustomerNotes(int customer) async {
    await DB.init();
    var res = await DB.rawQuery("noteDetails WHERE custId = '$customer'");
    int count = res.length;
    List<CustomerNote> cnotelist = List<CustomerNote>();
    for (int i = 0; i < count; i++) {
      cnotelist.add(CustomerNote.fromMap(res[i]));
    }
    return cnotelist;
  }

People_List.dart //这是显示客户列表的文件

import 'package:customer/models/Note.dart';
import 'package:customer/models/addCustomer.dart';
import 'package:customer/screens/New_Note.dart';
import 'package:customer/screens/Note_info.dart';
import 'package:customer/screens/User_Settings.dart';
import 'package:customer/screens/add_person.dart';
import 'package:customer/services/db_service.dart';
import 'package:customer/utils/database_helper.dart';
import 'package:flutter/material.dart';
import 'dart:io';
import 'package:sqflite/sqflite.dart';

class People_List extends StatefulWidget{


  @override
  State<StatefulWidget> createState() {
    return People_ListState();
  }

}

class People_ListState extends State<People_List> with SingleTickerProviderStateMixin{

  DBService dbService = DBService();
  List<AddCustomer> customerList;
  int count = 0;

  static final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
  var _isSelectedItemIndex;
  TextEditingController _searchQuery;
  bool _isSearching = false;
  String searchQuery = "Search query";
  @override
  void initState() {
    super.initState();
    _searchQuery = new TextEditingController();
  }

  void _startSearch() {
    print("open search box");
    ModalRoute
        .of(context)
        .addLocalHistoryEntry(new LocalHistoryEntry(onRemove: _stopSearching));

    setState(() {
      _isSearching = true;
    });
  }

  void _stopSearching() {
    _clearSearchQuery();

    setState(() {
      _isSearching = false;
    });
  }

  void _clearSearchQuery() {
    print("close search box");
    setState(() {
      _searchQuery.clear();
      updateSearchQuery("Search query");
    });
  }

  Widget _buildTitle(BuildContext context) {
    var horizontalTitleAlignment =
    Platform.isIOS ? CrossAxisAlignment.center : CrossAxisAlignment.start;

    return new InkWell(
      onTap: () => scaffoldKey.currentState.openDrawer(),
      child: new Padding(
        padding: const EdgeInsets.symmetric(horizontal: 12.0),
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: horizontalTitleAlignment,
          children: <Widget>[
            const Text(''),
          ],
        ),
      ),
    );
  }

  Widget _buildSearchField() {
    return new TextField(
      controller: _searchQuery,
      autofocus: true,
      decoration: const InputDecoration(
        hintText: 'Search...',
        border: InputBorder.none,
        hintStyle: const TextStyle(color: Colors.white30),
      ),
      style: const TextStyle(color: Colors.white, fontSize: 16.0),
      onChanged: updateSearchQuery,
    );
  }

  void updateSearchQuery(String newQuery) {

    setState(() {
      searchQuery = newQuery;
    });
    print("search query " + newQuery);

  }

  List<Widget> _buildActions() {

    if (_isSearching) {
      return <Widget>[
        new IconButton(
          icon: const Icon(Icons.clear),
          onPressed: () {
            if (_searchQuery == null || _searchQuery.text.isEmpty) {
              Navigator.pop(context);
              return;
            }
            _clearSearchQuery();
          },
        ),
      ];
    }
    return <Widget>[
      new IconButton(
        icon: const Icon(Icons.search),
        onPressed: _startSearch,
      ),
    ];
  }

  @override
  Widget build(BuildContext context) {
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;
    if (customerList == null) {
      customerList = List<AddCustomer>();
      updateListView();
    }
    return Scaffold(
      appBar: new AppBar(
        leading: _isSearching ? const BackButton() : null,
        title: _isSearching ? _buildSearchField() : _buildTitle(context),
        actions: _buildActions(),

      ),
      body:getCustomerListView(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          navigateToCustomer(AddCustomer(), 'Add Person');
        },

        child: const Icon(Icons.add),

      ),
      bottomNavigationBar:Row (
      children: <Widget>[
        buildNavBarItem(Icons.home,0,"Home"),
        buildNavBarItem(Icons.fiber_new_rounded,1,"Upcoming"),
        buildNavBarItem(Icons.history,2,"History"),
        buildNavBarItem(Icons.account_circle,3,"Account"),

      ],
      ),
    );
  }

  ListView getCustomerListView() {

    TextStyle titleStyle = Theme.of(context).textTheme.subhead;

    return ListView.builder(
      itemCount: count,
      itemBuilder: (BuildContext context, int position) {
        return Card(
          color: Colors.white,
          elevation: 2.0,
          child: ListTile(

            /*trailing: CircleAvatar(
              backgroundColor: getPriorityColor(this.noteList[position].priority),
              child: getPriorityIcon(this.noteList[position].priority),
            ),*/

            title: Text(this.customerList[position].custName, style: titleStyle,),
            //subtitle: Text(this.customerList[position].date),

            onTap: () {

            },

          ),
        );
      },
    );
  }


  void navigateToCustomer(AddCustomer customer, String title) async {
    bool result = await Navigator.push(context, MaterialPageRoute(builder: (context) {
      return AddPerson(customer, title);
    }));

    if (result == true) {
      updateListView();
    }
  }
  void updateListView() {
    final Future<Database> dbFuture = DB.init();
    dbFuture.then((database) {

      Future<List<AddCustomer>> customerListFuture = dbService.getCustomerList();
      customerListFuture.then((customerList) {
        setState(() {
          this.customerList = customerList;
          this.count = customerList.length;
        });
      });
    });
  }

  Widget buildNavBarItem(IconData icon,int index,title) {
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;

    return GestureDetector(
      onTap: () {
      setState(() {
        _isSelectedItemIndex=index;
        if(_isSelectedItemIndex==3) {
          Navigator.of(context).push(MaterialPageRoute(
              builder: (BuildContext context) => User_Settings()));
        }
      });
      },
      child: Container(
          height: height * 0.09,
          width: width / 4,
          decoration: index==_isSelectedItemIndex?BoxDecoration(
          border: Border(
            bottom: BorderSide(width: 4,color: Theme.of(context).primaryColor),
          ),
            gradient: LinearGradient(colors: [
              Theme.of(context).primaryColor.withOpacity(0.3),
              Theme.of(context).primaryColor.withOpacity(0.015),
            ],begin: Alignment.bottomCenter,end: Alignment.topCenter)
          ):BoxDecoration(),
          child: Column(
            children: <Widget>[
              InkWell(
                child: Icon(icon,
                  color: index==_isSelectedItemIndex? Theme.of(context).primaryColor:Colors.black54,
                ),

              ),
              Text(title)
            ],)),
    );
  }
}

Note_Info.dart

    class Note_Info extends StatefulWidget{
  final String appBarTitle;
  final AddCustomer customer;

  Note_Info(this. customer, this.appBarTitle);
  @override
  State<StatefulWidget> createState() {
    return Note_InfoState(this.customer,this.appBarTitle);
  }

}

class Note_InfoState extends State<Note_Info> {
  CustomerNote note=CustomerNote();
  DBService dbService = DBService();
  List<CustomerNote> cnoteList;
  int count = 0;
  String appBarTitle;
  AddCustomer customer;

  Note_InfoState(this.customer, this.appBarTitle);

  PickedFile _imageFile;
  final ImagePicker _picker = ImagePicker();
  bool rememberMe = false;
  DateTime _date = DateTime.now();
  TextEditingController custNameController = TextEditingController();


    
      void getImage(ImageSource source) async {
        final pickedFile = await _picker.getImage(
            source: source);
        setState(() {
          _imageFile = pickedFile;
        });
      }
    
    
      @override
      Widget build(BuildContext context) {
    
        if (noteList == null) {
          noteList = List<CustomerNote>();
          updateCustomerNotes();
        }
        var height = MediaQuery.of(context).size.height;
        custNameController.text = customer.custName;
        return DefaultTabController(
            length: 4,
            child: Scaffold(
                appBar: AppBar(
                  actions: [
                    IconButton(
                      icon: Icon(
                        Icons.add,
    
                      ),
                      onPressed: () {
                        Navigator.of(context).push(MaterialPageRoute(
                            builder: (BuildContext context) => NewNote()));
                      },
                    )
                  ],
                ),
                body: Container(
                  child: Column(
                      children: <Widget>[
                        TextField(controller: custNameController,
                            style: TextStyle(
                                fontSize: 20.0, fontWeight: FontWeight.bold),
    
                            textAlign: TextAlign.center),
                        Padding(
                          padding: const EdgeInsets.all(15.0),
                          child: Row(children: [
                            ImageProfile(),
                            Padding(
                              padding: const EdgeInsets.only(left: 30.0),
                              child: IconButton(
                                icon: Icon(
                                  Icons.call,
                                  color: Colors.green,
                                  size: 45,
                                ),
                                onPressed: () {
    
                                },
                              ),
                            ),
    
                          ],),
                        ),
    
                        SizedBox(
                          height: 50,
                          child: AppBar(
                            bottom: TabBar(
                              tabs: [
                                Tab(
                                  text: "All",
                                ),
                                Tab(
                                  text: "Pending",
                                ),
                                Tab(
                                  text: "Cancelled",
                                ),
                                Tab(
                                  text: "Completed",
                                ),
                              ],
                            ),
                          ),
                        ),
    
                        // create widgets for each tab bar here
                        Expanded(
                          child: TabBarView(
                            children: [
                              // first tab bar view widget
                              Container(
                                child: getNoteListView(),
    
                              ),
    
                              // second tab bar view widget
                              Container(
                                child: Center(
                                  child: Text(
                                    'Pending Items',
                                  ),
                                ),
                              ),
                              Container(
                                child: Center(
                                  child: Text(
                                    'Cancelled',
                                  ),
                                ),
                              ),
                              Container(
    
                                child: Center(
                                  child: Text(
                                    'Completed',
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Container(
                            height: 55.0,
                            width: 200,
                            child: RaisedButton(
                              elevation: 2,
    
                              shape: RoundedRectangleBorder(
                                  borderRadius: BorderRadius.circular(20)),
                              color: Theme
                                  .of(context)
                                  .primaryColorDark,
                              textColor: Colors.white,
                              child: Text('Save', textScaleFactor: 1.5,),
                              onPressed: () {
                                setState(() {
                                  //_reset();
                                });
                              },
                            ),
                          ),
                        ),
                      ]
                  ),
                )
            ));
      }
    void updateCustomerNotes() {

    final Future<Database> dbFuture = DB.init();
    dbFuture.then((database) {
      int customerId=customer.custId;
      Future<List<CustomerNote>> noteListFuture = dbService.getCustomerNotes(customerId);
      noteListFuture.then((cnoteList) {
        setState(() {
          this.cnoteList = cnoteList;
          //this.count = cnoteList.length;
        });
      });
    });
  }

  ListView getNoteListView() {

    TextStyle titleStyle = Theme.of(context).textTheme.subhead;

    return ListView.builder(
      itemCount: count,
      itemBuilder: (BuildContext context, int position) {
        return Card(
          color: Colors.white,
          elevation: 2.0,
          child: ListTile(

            title: Text(this.cnoteList[position].note, style: titleStyle,),

            subtitle: Text(this.cnoteList[position].date),

            trailing: GestureDetector(
              child: Icon(Icons.delete, color: Colors.grey,),
              onTap: () {

              },
            ),

            onTap: () {

            },
          ),
        );
      },
    );
  }

    
      void _showSnackBar(BuildContext context, String message) {
    
        final snackBar = SnackBar(content: Text(message));
        Scaffold.of(context).showSnackBar(snackBar);
      }
      Widget ImageProfile() {
        return Center(
          child: CircleAvatar(
              radius: 80.0,
              backgroundImage: AssetImage('images/person_icon.jpg')
    
          ),
        );
      }
    }

【问题讨论】:

    标签: flutter listview sqflite


    【解决方案1】:

    如果您想从服务器获取一些特定数据,那么您需要在查询中提供 (where: ),例如

       List<Map> result = await db.query(
            DatabaseHelper.table,
            columns: columnsToSelect,
            where: whereString,
            whereArgs: whereArguments);
    
        // print the results
        result.forEach((row) => print(row));
        // {_id: 1, name: Bob, age: 23}
      }
    

    请注意,您的查询可能与上述查询不同。

    如果你想从已经获取的数据中获取相同的特定数据,那么你还需要使用 where 子句,例如

    final outData = responseData.where((i) => i.userId == customerId).toList();
    

    然后通过params将outData传递给下一页。

    【讨论】:

    • 我没听懂你。我应该在哪里添加此代码?你能对我的代码稍微具体一点吗?我应该将此代码添加到 db_helper 还是 People_List.dart 中??
    • 嗨@FathimaShafana,如果我没记错的话,db_helper 中的 getNoteList() 函数具有从 db 获取 noteList 的查询。因此,要使用 customerId 获取特定客户的所有备注列表,您必须在 getNoteList() 函数查询中添加 where 子句。 --> where: 'customerId= xyz',
    • 实际上现在我已经添加了查询,但它没有显示我不知道我错在哪里我将编辑问题 n 显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多