我用Streambuilder
接收Firestore的数据,expenseTotalAmount
是第一次更新或者页面初始化的时候更新的,在添加了一些费用后,expenseTotalAmount
不是实时更新的,我必须刷新页面才能更新,我可以理解问题出现在费用总额的计算。如何让UI实时更新。
这是我的代码更新
Pls check the problem
class MyWidget extends StatefulWidget {
const MyWidget({super.key});
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
final budgetStream = budgetCollectionRef.snapshots();
final expenseStream = expenseCollectionRef.snapshots();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Expanded(
child: StreamBuilder<QuerySnapshot>(
stream: budgetStream,
builder: (context, budgetSnapshot) {
return StreamBuilder(
stream: expenseStream,
builder: (context, expenseSnapshot) {
List<Map<String, dynamic>> budgetDataList = [];
List<Map<String, dynamic>> expenseDataList = [];
if (budgetSnapshot.hasData &&
budgetSnapshot.data != null &&
budgetSnapshot.data!.docs.isNotEmpty) {
List<DocumentSnapshot> documents = budgetSnapshot.data!.docs;
for (var document in documents) {
String documentId = document.id;
Map<String, dynamic> data =
document.data() as Map<String, dynamic>;
data['documentId'] = documentId;
budgetDataList.add(data);
}
}
if (expenseSnapshot.hasData &&
expenseSnapshot.data != null &&
expenseSnapshot.data!.docs.isNotEmpty) {
List<DocumentSnapshot> documents =
expenseSnapshot.data!.docs;
for (var document in documents) {
Map<String, dynamic> data =
document.data() as Map<String, dynamic>;
expenseDataList.add(data);
}
}
return ListView.builder(
itemCount: budgetDataList.length,
itemBuilder: (context, index) {
Timestamp fromDate = budgetDataList[index]['FromDate'];
Timestamp tillDate = budgetDataList[index]['TillDate'];
double budgetAmount =
budgetDataList[index]['Amount'].toDouble();
String category = budgetDataList[index]['CategoryName'];
double percentage =
budgetDataList[index]['Percentage'].toDouble();
List<Map<String, dynamic>> filteredList;
if (category == 'All Categories') {
filteredList = expenseDataList.where((expense) {
Timestamp expenseDate = expense['UserSelectedDate'];
return expenseDate.compareTo(fromDate) >= 0 &&
expenseDate.compareTo(tillDate) <= 0;
}).toList();
} else {
filteredList = expenseDataList.where((expense) {
Timestamp expenseDate = expense['UserSelectedDate'];
return expenseDate.compareTo(fromDate) >= 0 &&
expenseDate.compareTo(tillDate) <= 0 &&
expense['Category'] == category;
}).toList();
}
// I think the problem occurs here ....................................................
double expenseTotalAmount = filteredList.fold(
0.0,
(previous, expense) => previous + (expense['Amount']),
);
double balance = budgetAmount - expenseTotalAmount;
double calPercentage =
calculatePercentage(expenseTotalAmount, budgetAmount);
return BudgetDisplyCard(
documentId: documentId,
percentage: percentage,
calPercentage: calPercentage,
expenseAmount: expenseTotalAmount,
balanceAmount: balance,
);
},
);
},
);
},
),
),
);
}
}
字符串
请只看可能导致问题的代码;正如我提到的,如果其他代码让你恼火。
1条答案
按热度按时间svmlkihl1#
字符串