Длина получателя 'длина' была вызвана нулем, Ошибка в флаттере - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно перечислить таблицу в базе данных .db. Когда я запускаю приложение в эмуляторе, на секунду на экран выскакивает ошибка "длина получателя 'длина' была вызвана", но затем нужный мне список отображается сразу. И когда вы запускаете Debug на подключенном смартфоне, все останавливается с ошибкой «Длина getter 'вызвана на null".

В чем может быть проблема? Кажется, что где-то не хватает метода ожидания данных из базы данных.

I/flutter (10923): /data/user/0/com.example.test_project/databases/database.db
I/flutter (10923): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY 
╞═══════════════════════════════════════════════════════════
I/flutter (10923): The following NoSuchMethodError was thrown building 
FutureBuilder<List<Authors>>(dirty, state:
I/flutter (10923): _FutureBuilderState<List<Authors>>#3ecfd):
I/flutter (10923): The getter 'length' was called on null.
I/flutter (10923): Receiver: null
I/flutter (10923): Tried calling: length

Database.dart

class DBProvider {
  DBProvider._();

  static final DBProvider db = DBProvider._();

  Database _database;

  Future<Database> get database async {

    _database = await initDB();
    return _database;
  }

  initDB() async {
    String path = join(await getDatabasesPath(), "database.db");
    var exists = await databaseExists(path);
    print(path);
    return await openDatabase(path);
  }

  Future<List<Authors>> getAllClients() async {
    final db = await database;
    var res = await db.query('category');
    print(res);
    List<Authors> list = [];
    list = res.map((c) => Authors.fromMap(c)).toList();
    return list;
  }
}

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

class MainTab extends StatefulWidget {
  @override
  _MainTabState createState() => _MainTabState();
}

class _MainTabState extends State<MainTab> {

  @override
  Widget build(BuildContext context) {
      return Padding(
        padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),
        child: Container(
            padding: EdgeInsets.all(15),
            decoration: BoxDecoration(
                color: Theme.of(context).accentColor,
                borderRadius: BorderRadius.all(Radius.circular(30))
            ),
            child: FutureBuilder<List<Authors>>(
              future: DBProvider.db.getAllClients(),
              builder: (context, snapshot) {
                return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (context, index) {
                    Authors item = snapshot.data[index];
                    return ListTile(
                      title: Text(item.name),
                      leading: Icon(Icons.folder),
                      trailing: Text(item.count.toString()),
                      onTap: () {

                      },
                    );
                  },
                );
              },
            )
        ),
      );
    }
}

1 Ответ

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

Использовать ConnectionState https://pub.dev/documentation/flutter_for_web/latest/widgets/FutureBuilder-class.html

Вы должны написать что-то вроде этого:

  FutureBuilder<List<Authors>>(
                future: DBProvider.db.getAllClients(),
                builder: (context, snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.waiting:
                      return Center(
                        child: CircularProgressIndicator(),
                      );
                    case ConnectionState.done:
                      {
                        if (snapshot.hasError) {
                          return Center(
                        child: Text(snapshot.error.toString()),
                         );
                        } else if (snapshot.hasData) {
                           return ListView.builder(
                  itemCount:snapshot.data==null?0: snapshot.data.length,
                  itemBuilder: (context, index) {
                    Authors item = snapshot.data[index];
                    return ListTile(
                      title: Text(item.name),
                      leading: Icon(Icons.folder),
                      trailing: Text(item.count.toString()),
                      onTap: () {

                      },
                    );
                        }
                        return Center(child: Text('No Data'));
                      }
                    default:
                      return Container();
                  }
                }),


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...