Flutter:无需触发按钮调用数据库查询的实现方法
无需按钮触发数据库查询的实现方案
当然有办法不用按钮触发cetak()执行查询,你可以借助Flutter组件的生命周期方法或者自动触发逻辑来实现,以下是几种实用的方式:
1. 组件初始化时自动执行(用initState)
当StatefulWidget完成初始化后,initState会被调用一次,非常适合用来执行页面加载时的初始化查询:
@override void initState() { super.initState(); // 页面加载完成后自动触发查询 _runInitialQuery(); } // 封装异步逻辑,避免直接在initState中使用async void _runInitialQuery() async { await cetak("SELECT CUST_NAME FROM ts_custxm "); } // 你的cetak方法,这里修正了原代码的小问题 cetak(String query) async { var req = await SqlConn.readData(query); var parsedJson = jsonDecode(req); debugPrint(parsedJson.toString()); // 原代码里的res此时还未赋值,应该打印parsedJson setState(() { res = parsedJson; }); }
注意:initState本身不能是异步方法,所以需要单独封装一个异步函数来调用cetak。
2. 结合FutureBuilder自动执行并构建UI
如果需要在查询完成后自动渲染数据UI,可以用FutureBuilder,它会在异步任务完成后自动更新界面:
@override Widget build(BuildContext context) { return FutureBuilder( // 直接在这里触发查询 future: cetak("SELECT CUST_NAME FROM ts_custxm "), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { // 查询加载中显示加载动画 return const Center(child: CircularProgressIndicator()); } else if (snapshot.hasError) { // 查询出错时显示错误信息 return Text("查询失败:${snapshot.error}"); } else { // 查询完成,渲染数据列表 return ListView.builder( itemCount: res.length, itemBuilder: (context, index) { return ListTile(title: Text(res[index]['CUST_NAME'])); }, ); } }, ); }
注意:如果页面因状态变化重建,FutureBuilder会重新执行查询,你可以把Future对象存在State变量中,避免重复执行。
3. 依赖变化时自动执行(用didChangeDependencies)
如果你的查询依赖于InheritedWidget或其他全局状态,可以在didChangeDependencies中调用,当依赖项变化时自动触发查询:
@override void didChangeDependencies() { super.didChangeDependencies(); // 依赖项变化时触发查询 cetak("SELECT CUST_NAME FROM ts_custxm "); }
注意:这个方法可能会被多次调用,如果你不需要重复执行查询,记得加判断条件(比如只在第一次调用时执行)。
额外提醒
- 确保
SqlConn已经完成初始化连接,否则查询会直接失败,建议在调用cetak前先检查连接状态。 - 原代码中
debugPrint(res.toString())存在问题,因为res是在setState后才被赋值的,此时打印会输出初始值(大概率是null),应该改成打印parsedJson。
内容的提问来源于stack exchange,提问作者Tsabit
相关产品推荐
相关产品推荐

