getter'length'被调用为null,Flutter中出现错误。

问题描述 投票:0回答:1

我需要在一个.db数据库中列出一个表。当我在模拟器中运行应用程序时,错误 "The getter 'length' was called on null "弹出一秒钟,但随后我需要的列表立即显示.当你在连接的智能手机上启动Debug时,一切都以错误 "The getter 'length' was called on 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

数据库.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;
  }
}

这个类是绘制数据库中元素表的UI的地方。

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: () {

                      },
                    );
                  },
                );
              },
            )
        ),
      );
    }
}
android flutter dart apk
1个回答
0
投票

使用连接状态https:/pub.devdocumentationflutter_for_weblatestwidgetsFutureBuilder-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();
                  }
                }),


© www.soinside.com 2019 - 2024. All rights reserved.