我需要列出.db数据库中的表。当我在模拟器中运行应用程序时,错误消息“ getter'length'被调用为null”弹出一秒钟,但是随后我需要的列表立即显示。 而且,当您在连接的智能手机上启动Debug时,一切都会停止,并显示错误消息“ getter'length'被调用为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;
}
}
这是一个类,用于绘制数据库中元素表的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: () {
},
);
},
);
},
)
),
);
}
}
答案 0 :(得分:0)
使用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();
}
}),