我有一個場景,用戶登錄他要么被重定向到儀表板或另一個螢屏。在某些時候,資料會從服務器中提取并保存到本地資料庫,然后我將其渲染到儀表板螢屏。每當用戶第一次登錄時,我都會收到此錯誤
未處理的例外:在 null 上呼叫了方法“[]”
我認為我的儀表板是在加載資料之前設定的,我嘗試設定setstate(){} 但我一直在獲取它
這是我的實作
@override
void initState() {
super.initState();
init();
}
Future<void> init() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String userid = prefs.getString("id") ?? "";
token = prefs.getString("auth_token");
List<ParticipantRegistrationData> list = await db.getParticipants();
for (var i in list) {
List<dynamic> sched = await db.getScheduleByparticipantId(i.participantid!);
List<int> missingOrComplete = [0, 0];
for (var j in sched) {
if (j.showUp >= 1 ) {
missingOrComplete[1] ;
} else if (j.showUp == 0 && DateTime.parse(j.windowEnd).isBefore(DateTime.now())) {
missingOrComplete[0] ;
}
}
participantCounts[i.participantid!] = missingOrComplete;
}
setState(() async {
participantSchedules = await db.getSchedulesByUserId(userid);
participants = await db.getParticipantsById(userid);
name = prefs.getString("fullname");
getTransactions();
});
// use db to draw data
}
然后是獲取資料以顯示在儀表板中的獲取事務功能
void getTransactions() {
for (ParticipantRegistrationData data in participants) {
setState(() {
transactionList.add(WATransactionModel(
name: data.fullname,
participantid: data.participantid,
gender: data.gender,
completedScheduleid: '15',
missedSchedule: '4',
color: Color(0xFF26C884),
colors: Color(0xFFFF1744),
title: 'Name: ',
completedSchedule: 'Schedule',
image: 'images/walletApp/man.png',
missed: 'Missed: ${participantCounts[data.participantid!][0]}',
completed: 'Completed: ${participantCounts[data.participantid!][1]}',
description: 'Number: ',
));
});
}
}
繼續拋出錯誤的行是
missed: 'Missed: ${participantCounts[data.participantid!][0]}',
在設定 ui 之前我應該??將我的應用程式設定為首先加載內容,我有點困惑或者我應該如何設定重定向(在加載 ui 之前重繪 頁面的路由)或在 UI 之前先設定資料?
更新 1:當我轉到另一個螢屏并回傳資料時,我忘了提及已經加載并且沒有錯誤。第一次設定螢屏時出現錯誤
uj5u.com熱心網友回復:
我相信這是你的問題。void getTransactions() {應該是Future<void>getTransactions() async {,當你呼叫函式時你需要等待它,所以你必須使你呼叫的函式異步回應。所以void getTransactions() {應該改為
Future<void>getTransactions() async {
它將正確無誤地獲取資料
uj5u.com熱心網友回復:
撰寫函式的方式是正確的。但是,當我們在 initState 中呼叫一個函式時,它不會等待自身,而是與您的構建方法并行運行。因此,一種方法是檢查您的構建方法。
例如:
participantCounts==null || participantCounts.isEmpty? return CircularProgressIndicator() : return Container();
因此,在這種情況下,您的構建方法將顯示加載程式,直到您的資料可用。
我還建議您實施任何狀態管理技術以獲得更好的處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426612.html
上一篇:顫振改變狀態名稱
