Создайте FeatureBuilder из базы данных во Flutter - PullRequest
1 голос
/ 20 июня 2020

Я сохранил список вызовов своего телефона в базе данных и теперь хочу создать ListView из этой базы данных. Я уже написал этот код. Но это не работает. что не так с моим кодом?

database_helper.dart

...

    Future<List<Map<String, dynamic>>> queryAllRows() async {
    Database db = await instance.database;
    return await db.query(table);
  }

...

my_home.dart

...

FutureBuilder(
              future: db.queryAllRows(),
              builder: (context, snapshot) {
                if (!snapshot.hasData)
                  return Center(child: CircularProgressIndicator());

                List entries = snapshot.data.toList();
                return Scrollbar(
                  child: ListView.builder(
                    itemBuilder: (context, index) {
                      var entry = entries[index];
                      var mono = TextStyle(fontFamily: 'monospace');

                      return Column(
                        children: <Widget>[
                          Divider(),
                          Text('NUMBER   : ${entry.number}', style: mono),
                          Text('NAME     : ${entry.name}', style: mono),
                          Text('TYPE     : ${entry.callType}', style: mono),
                          Text(
                              'DATE     : ${DateTime.fromMillisecondsSinceEpoch(entry.timestamp)}',
                              style: mono),
                          Text('DURATION :  ${entry.duration}',
                              style: mono),
                        ],
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisAlignment: MainAxisAlignment.start,
                      );
                    },
                    itemCount: entries.length,
                  ),
                );
              })

...

1 Ответ

0 голосов
/ 20 июня 2020

Вам необходимо использовать ConnectionState внутри вашего построителя. Взгляните на этот шаблон кода: (В настоящее время конструктор возвращает ваш виджет, не дожидаясь завершения работы в будущем)

 return FutureBuilder<List<Map<String, dynamic>>>(
    future: db.queryAllRows(),
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        // future complete
        if (snapshot.hasError || !snapshot.hasData) {
          return Center(child: CircularProgressIndicator());
        }
        // future complete with no error and has data
        List entries = snapshot.data.toList();
        return Scrollbar(
          child: ListView.builder(
            itemBuilder: (context, index) {
              var entry = entries[index];
              var mono = TextStyle(fontFamily: 'monospace');

              return Column(
                children: <Widget>[
                  Divider(),
                  Text('NUMBER   : ${entry.number}', style: mono),
                  Text('NAME     : ${entry.name}', style: mono),
                  Text('TYPE     : ${entry.callType}', style: mono),
                  Text(
                      'DATE     : ${DateTime.fromMillisecondsSinceEpoch(entry.timestamp)}',
                      style: mono),
                  Text('DURATION :  ${entry.duration}', style: mono),
                ],
                crossAxisAlignment: CrossAxisAlignment.start,
                mainAxisAlignment: MainAxisAlignment.start,
              );
            },
            itemCount: entries.length,
          ),
        );
      }
      // return loading widget while connection state is active
      else {
        return Center(child: CircularProgressIndicator());
      }
    });
...