仅在热重载或抖动后显示数据

时间:2019-12-30 19:11:58

标签: flutter

在我的数据库中,我有一个用户表,其中存储了用户名和一些标记。当用户转到特定页面时,我想在表中查看该数据。因此,当我第一次进入该页面时,数据(用户名和标记)不会显示。但是,如果我热装或使用按钮刷新,则数据将正确显示。我的问题是如何在不进行热重装或不使用刷新按钮的情况下做到这一点。这是我的代码:

import 'package:flutter/material.dart';
import 'package:flutter_app/database/db_helper.dart';
import 'package:flutter_app/database/user.dart';

class ViewResult extends StatefulWidget {
 @override
 _ViewResult createState() => _ViewResult();
}

GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey();

class _ViewResult extends State<ViewResult> {
 String tempEmail;
 bool check = true;

 var dbHelper;
 var data = List<User>();

 @override
 void initState() {
   setState(() {
     dbHelper = DBHelper();
     resultData();
   });
   super.initState();
 }

 void resultData() {
     dbHelper.getUser().then((users) {
       for (User temp in users) {
         if (temp.type == "student") data.add(temp);
       }
     });
 }

 @override
 Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(
       centerTitle: true,
       title: Text("Result"),
     ),
     body: DataTable(
       columnSpacing: 22,
       columns: [
         DataColumn(label: Text("Username")),
         DataColumn(label: Text("Beginner")),
         DataColumn(label: Text("Intermediate")),
         DataColumn(label: Text("Advanced")),
       ],
       rows: data
           .map((user) => DataRow(cells: [
                 DataCell(Text(user.email)),
                 DataCell(Text(user.beginnerMark.toString())),
                 DataCell(Text(user.intermediateMark.toString())),
                 DataCell(Text(user.advancedMark.toString())),
               ]))
           .toList(),
     ),
     backgroundColor: Color.fromRGBO(130, 178, 220, 1),
   );
 }
}

3 个答案:

答案 0 :(得分:1)

加载数据后,您必须使用setState ,并且您的resultData函数正在使用then,该函数在初始{{ setState中的1}}完成。

initState

我更喜欢使用@override void initState() { // super.initState(); should be at the start of the method super.initState(); dbHelper = DBHelper(); resultData(); } void resultData() { dbHelper.getUser().then((users) { for (User temp in users) { if (temp.type == "student") data.add(temp); } // since you have already added the results to data // setState can have an empty function body setState(() {}); }); } 而不是async/await,所以我的解决方案如下:

then

答案 1 :(得分:1)

TLDR:如果没有,请从setState()内部调用then(),它将在所有操作完成之前执行,并且完全无效。

getUser().then((response) {
   //Your stuff

   setState(() {}); //refresh
  });

答案 2 :(得分:-2)

您需要setState(() {});。 将其添加到resultData函数结尾处:

void resultData() {
  dbHelper.getUser().then((users) {
     for (User temp in users) {
       if (temp.type == "student") data.add(temp);
     }
   setState(() {});
  });

}

有关更多信息,请参见setState