来自数据库的数据在 listview flutter 中不是 fetched/displayed

Data from database is not fetched/displayed in listview flutter

我有一个使用列表视图显示客户列表的屏幕。接下来,当我单击一个客户时,我只想在列表视图的下一个屏幕中显示该特定客户(customerId)的注释(记录)。这是我的代码,应该可以正常工作但不显示任何内容。我已经检查过 noteDetails table 是否包含数据并且它有。谁能告诉我哪里错了或者我应该添加什么代码。

main.dart

import 'package:flutter/material.dart';
import 'package:vers2cts/screens/user_login.dart';

void main() {
  runApp(MyApp());
}
Map<int, Color> color ={50:Color.fromRGBO(170, 0, 95,  .1),
  100:Color.fromRGBO(170, 0, 95, .2),
  200:Color.fromRGBO(170, 0, 95, .3),
  300:Color.fromRGBO(170, 0, 95, .4),
  400:Color.fromRGBO(170, 0, 95, .5),
  500:Color.fromRGBO(170, 0, 95, .6),
  600:Color.fromRGBO(170, 0, 95, .7),
  700:Color.fromRGBO(170, 0, 95, .8),
  800:Color.fromRGBO(170, 0, 95, .9),
  900:Color.fromRGBO(170,0,95, 1),};
MaterialColor colorCustom = MaterialColor(0xFF880E4F, color);
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'NoteKeeper',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
          primarySwatch:colorCustom,
          primaryColor:colorCustom//primarySwatch: Colors.purple
      ),
      home: UserLogin(),
    );
  }
}

Note_info.dart //这是我要显示特定客户注释的文件。

import 'dart:io';
import 'package:customer/models/CustomerNote.dart';
import 'package:customer/models/addCustomer.dart';
import 'package:customer/services/db_service.dart';
import 'package:customer/utils/database_helper.dart';
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'New_Note.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> {
  DBService dbService = DBService();
  List<CustomerNote> noteList;
  int count = 0;

  static final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
  CustomerNote note=CustomerNote();
  String appBarTitle;
  AddCustomer customer;
  Note_InfoState(this.customer, this.appBarTitle);


 
  DateTime _date = DateTime.now();
  TextEditingController custNameController = TextEditingController();

  @override
  void initState() {
    super.initState();
  }


  @override
  Widget build(BuildContext context) {
    int customerId=customer.custId;
    if (noteList == null) {
      noteList = List<CustomerNote>();
      updateListView();
    }

    TextStyle titleStyle = Theme.of(context).textTheme.subhead;
    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(note)));
                  },
                )
              ],
            ),
            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(customer.custPhoto),
                        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 viiew widget
                          Container(

                          ),


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

  Widget ImageProfile(String fileName) {
    return Center(
      child: CircleAvatar(
          radius: 80.0,
          backgroundImage:  fileName == null
              ?AssetImage('images/person_icon.jpg')
              :FileImage(File(customer.custPhoto))),

    );

  }


  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.noteList[position].note, style: titleStyle,),
          
            trailing: GestureDetector(
              child: Icon(Icons.delete, color: Colors.grey,),
              onTap: () {
               
              },
            ),
            onTap: () {
             
            },

          ),
        );
      },
    );
  }
  void updateListView() {
    final Future<Database> dbFuture = DB.init();
    dbFuture.then((database) {
      int cid=customer.custId;
      Future<List<CustomerNote>> noteListFuture = dbService.getCustomerNotes(cid);
      noteListFuture.then((noteList) {
        setState(() {
          this.noteList = noteList;
          this.count = noteList.length;
        });
      });
    });
  }

}

New_Note.dart //这是在数据库中成功添加新笔记的地方

import 'package:customer/models/CustomerNote.dart';
import 'package:customer/models/addCustomer.dart';
import 'package:customer/screens/Note_info.dart';
import 'package:customer/services/db_service.dart';
import 'package:customer/utils/form_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:table_calendar/table_calendar.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:smooth_star_rating/smooth_star_rating.dart';
import 'package:intl/intl.dart';

class NewNote extends StatefulWidget{
    final CustomerNote note;
    NewNote(this. note);

   final Function(Color) onChanged;
  final double height;
  final double width;

  NewNote({
    Key key,
    this.onChanged,
    this.height = 25,
    this.width = 150,
    this.label,
  }) : super(key: key);*/
  @override
  State<StatefulWidget> createState() {
    return New_NoteState(this.note);
  }

}
class New_NoteState extends State<NewNote> with SingleTickerProviderStateMixin{
  New_NoteState(this.note);
  CustomerNote note=new CustomerNote();
  AddCustomer customer=new AddCustomer();
  TextEditingController NoteController=TextEditingController();
  TextEditingController custNameController = TextEditingController();
  DateTime _reminderDate = DateTime.now();
DBService dbService=new DBService();

SpeedDial _speedDial(){
  return SpeedDial(
    animatedIcon: AnimatedIcons.add_event,

    animatedIconTheme: IconThemeData(size: 24.0),
    backgroundColor: Colors.yellow,
    curve: Curves.easeInCirc,
    children: [
      SpeedDialChild(
        child: Icon(Icons.location_on,color: Colors.yellow,),
        label: 'Add Location',
      ),
      SpeedDialChild(
          child: Icon(Icons.keyboard_voice),
          //backgroundColor: Colors.yellow,
          label: 'Add voice',
          //labelBackgroundColor: Colors.yellow

      ),
      SpeedDialChild(
          child: Icon(Icons.attachment_outlined,color :Colors.redAccent),
          label: 'Add File',
      ),
      SpeedDialChild(
          child: Icon(Icons.image,color: Colors.lightBlue,),
          label: 'Add Image',

      ),
    ],
  );
}

  //for DropDownMenu
  Color value=Colors.red;
  final List<Color> colors = [
    Colors.red,
    Colors.blue,
    Colors.green,
    Colors.yellow,
    Colors.pink,
    Colors.purple,
    Colors.brown,
  ];


  bool isSwitched = false;
  var textValue = 'Switch is OFF';

  void toggleSwitch(bool value) {

    if(isSwitched == false)
    {
      setState(() {
        isSwitched = true;
        this.note.remindOn = _reminderDate.toString();

      });
    }
    else
    {
      setState(() {
        isSwitched = false;
      });
    }
  }
  @override
  Widget build(BuildContext context) {
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;
    custNameController.text = customer.custName;

    return WillPopScope(

      onWillPop: () {
        moveToLastScreen();
      },
child: Scaffold(
      appBar:AppBar(),
      body:ListView(
        children: <Widget>[
        SizedBox(
          height: 2.0,
        ),
          TextField(controller: custNameController,
              style: TextStyle(
                  fontSize: 20.0, fontWeight: FontWeight.bold),

              textAlign: TextAlign.center),
        Align(
      alignment: Alignment.centerLeft,
          child: Text("Add New",textAlign: TextAlign.left,
          style: TextStyle(fontSize: 22,fontWeight: FontWeight.bold),),
        ),

      SizedBox(
        height: 2.0,
      ),
      Divider(),
      SizedBox(
        height: 2.0,
      ),
      Padding(
        padding: const EdgeInsets.all(8.0),
        child: TextField(
          controller: NoteController,
          decoration: InputDecoration(
          border: OutlineInputBorder(
            borderSide: const BorderSide(width: 2.0),)),
          keyboardType: TextInputType.multiline,
          minLines: 5,
          maxLines: 5,
          onChanged: (value) {
            this.note.note = value;
          },

        ),
      ),
      TableCalendar(
        selectedDayPredicate: (day) {
          return isSameDay(_reminderDate, day);
        },
        onDaySelected: (selectedDay, focusedDay) {
          setState(() {
            _reminderDate = selectedDay;
          });
        },
              focusedDay: DateTime.now(),
              firstDay: DateTime.utc(2010, 10, 16),
              lastDay: DateTime.utc(2030, 3, 14),),

        SizedBox(
          height: height*0.03,
        ),
        Padding(
          padding: const EdgeInsets.all(10.0),
          child: Row(//mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Text("Remind me",style: TextStyle(fontSize: 20),),

            Padding(
              padding: const EdgeInsets.only(left:80.0),
              child: Container(
                child: Switch(
                    onChanged: toggleSwitch,
                    value: isSwitched,
                   
              ),
            ),

          ],),
        ),
        Padding(
          padding: const EdgeInsets.all(10.0),
          child: Row(mainAxisAlignment: MainAxisAlignment.start,
            children:<Widget>[
              Text("Priority",style: TextStyle(fontSize: 20.0),),
             Padding(
               padding: const EdgeInsets.only(left:20.0),
               child: Container(
                 child: SmoothStarRating(
                  size: height=50.0,
                   allowHalfRating: false,
                   onRated: (value) {
                    this.note.priority=value;
                     print("rating value -> $value");

                   },
            ),
               ),
             )]),
        ),

        Padding(
          padding: const EdgeInsets.all(10.0),
          child: Row(mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[

            Text("Color",style: TextStyle(fontSize: 20),),
            Padding(
              padding: const EdgeInsets.only(left:80.0),
              child: Container(
                child: DropdownButton<Color>(
                value: value,
                
                onChanged: (color) {
                  setState(() => value = color);
                  
                },
                items: colors.map((e) => DropdownMenuItem(
                      value: e,
                      child: Container(
                       width: 60.0,
                        color: e,
                      ),
                  ),
                )
                      .toList(),
          ),
              ),
            ),

          ],),
        ),

          SizedBox(
          height: height*0.08,
        ),
        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(() {
                  _save();
                });
              },
            ),
          ),
        ),



      ],



    ),
 floatingActionButton:_speedDial(),
    ));

  }
  void moveToLastScreen() {
    Navigator.pop(context, true);
  }

  void _save() async {
    moveToLastScreen();
    note.custId=customer.custId;
    note.date = DateFormat.yMMMd().format(DateTime.now());
    int result;
    if (note.id != null) {  // Case 1: Update operation
      result = await dbService.updateNote(note);
    } else { // Case 2: Insert Operation
      result = await dbService.insertNote(note);
    }

    if (result != 0) {  // Success
      FormHelper.showAlertDialog(context,'Status', 'Note Saved Successfully');
    } else {  // Failure
      FormHelper.showAlertDialog(context,'Status', 'Problem Saving Note');
    }

  }
}

db_service.dart

 Future<bool> insertCustomer(AddCustomer model) async {
      await DB.init();
      bool isSaved = false;
      if (model != null) {
        int inserted = await DB.insert(AddCustomer.table, model);

        isSaved = inserted == 1 ? true : false;
      }

      return isSaved;
  }
Future<List<Map<String, dynamic>>> getCustomerMapList() async {
    await DB.init();
    var result = await DB.query(AddCustomer.table);
    return result;
  }


  Future<List<AddCustomer>> getCustomerList() async {

    var CustomerMapList = await getCustomerMapList(); 
    int count = CustomerMapList.length;

    List<AddCustomer> customerList = List<AddCustomer>();
   
    for (int i = 0; i < count; i++) {
      customerList.add(AddCustomer.fromMap(CustomerMapList[i]));
    }
    return customerList;
  }
 Future<int> insertNote(CustomerNote note) async {
    await DB.init();
    var result = await DB.insert(CustomerNote.table, note);
    return result;
  }

    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> notelist = List<CustomerNote>();
        for (int i = 0; i < count; i++) {
          notelist.add(CustomerNote.fromMap(res[i]));
        }
        return notelist;
      }

database_helper.dart

import 'dart:async';
import 'package:customer/models/model.dart';
import 'package:path/path.dart' as p;
import 'package:sqflite/sqflite.dart';

abstract class DB {
  static Database _db;

  static int get _version => 1;

  static Future<Database> init() async {
    if (_db != null) {
      return _db;
    }

    try {
      var databasesPath = await getDatabasesPath();
      String _path = p.join(databasesPath, 'Customer.db');
      _db = await openDatabase(_path, version: _version, onCreate: onCreate);
      print('db location:'+_path);

    } catch (ex) {
      print(ex);
    }
  }

  static void onCreate(Database db, int version) async {
    await db.execute(
        'CREATE TABLE userDetails (id INTEGER PRIMARY KEY AUTOINCREMENT, '
            'firstName STRING, '
            'lastName STRING, mobileNum STRING, emailId STRING, address String,'
            'userType STRING,password STRING)');
    await db.execute(
        'CREATE TABLE customerDetails (custId INTEGER PRIMARY KEY AUTOINCREMENT, '
            'custName STRING, '
            'mobileNum STRING, company STRING, custPhoto STRING, showOnCall bool,'
            'remindOn STRING,location STRING)');
    await db.execute(
        'CREATE TABLE noteDetails (noteId INTEGER PRIMARY KEY AUTOINCREMENT, '
            'custId STRING, '
            'custName STRING, date STRING, note STRING, remindOn STRING,'
            'priority STRING,status STRING,attachment STRING)');
    await db.execute(
    'CREATE TABLE languagesKnown(custId INTEGER REFERENCES customerDetails(custId),'
        ' languages STRING,PRIMARY KEY(custId))');

    }

  static Future<List<Map<String, dynamic>>> query(String table) async =>
      _db.query(table);

  static Future<int> insert(String table, Model model) async =>
      await _db.insert(table, model.toMap());

  static Future<int> update(String table, Model model) async => await _db
      .update(table, model.toMap(), where: 'id = ?', whereArgs: [model.id]);

  static Future<int> delete(String table, Model model) async =>
      await _db.delete(table, where: 'id = ?', whereArgs: [model.id]);

  static Future<int> deleteCustomer(String table, Model model) async =>
      await _db.delete(table, where: 'custId = ?', whereArgs: [model.custId]);

  static Future<Batch> batch() async => _db.batch();

  static Future<List<Map<String, dynamic>>> rawQuery(String table) async =>
      _db.query(table);


}

people_list.dart // 这是显示客户列表的地方,点击列表块即客户,Note_info 打开

import 'package:customer/models/addCustomer.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:customer/utils/form_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;
  
  @override
  void initState() {
    super.initState();
    _searchQuery = new TextEditingController();
  }

  
  

  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(''),
          ],
        ),
      ),
    );
  }
  @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(
        
      ),
      body:getCustomerListView(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          navigateToCustomer(AddCustomer(), 'Add Person');
        },

        child: const Icon(Icons.add),

      ),
      
  }

  ListView getCustomerListView() {

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

    return ListView.builder(
      itemCount: count,
      itemBuilder: (BuildContext context, int position) {
        var _imageFile=customerList[position].custPhoto;
        return Card(
          color: Colors.white,
          elevation: 2.0,
          child: ListTile(
            leading: CircleAvatar(
            backgroundImage: _imageFile==null?AssetImage('images/person_icon.jpg')
                :FileImage(File(_imageFile.toString()))),
            title: Text(this.customerList[position].custName, style: titleStyle,),
            trailing: Icon(Icons.keyboard_arrow_right),
            onTap: () {
              navigateToDetail(this.customerList[position],'Edit ');
            },

          ),
        );
      },
    );
  }
  
  void navigateToDetail(AddCustomer customer, String title) async {
    bool result = await Navigator.push(context, MaterialPageRoute(builder: (context) {
     return Note_Info(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;
        });
      });
    });
  }

 
}

最后只好自己解决了。问题是我创建笔记并将其保存在“笔记”table cust_id 中的地方没有保存在 table 中。所以我将 CustomerModel 对象和 NoteModel 对象传递给 New_Note()。现在工作正常

new_note.dart

 class NewNote extends StatefulWidget{
      final NoteModel note;
      final CustomerModel customer;
     
      NewNote(this.customer,this. note);
    
      @override
      State<StatefulWidget> createState() {
        //return New_NoteState(this.customer);
        return New_NoteState(this.customer,this.note);
      }
class New_NoteState extends State<NewNote> with SingleTickerProviderStateMixin{
  New_NoteState(this.customer,this.note);
  NoteModel note=new NoteModel();
  CustomerModel customer=new CustomerModel();
}
void _save() async {
    note.cust_id=customer.cust_id;
...
}