dart 变量未实时更新

cqoc49vn  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(81)

我用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,
                    );
                  },
                );
              },
            );
          },
        ),
      ),
    );
  }
}

字符串
请只看可能导致问题的代码;正如我提到的,如果其他代码让你恼火。

svmlkihl

svmlkihl1#

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<QuerySnapshot>(
              stream: expenseStream,
              builder: (context, expenseSnapshot) {
                // Check for data changes in both budget and expense streams
                if (budgetSnapshot.connectionState ==
                        ConnectionState.waiting ||
                    expenseSnapshot.connectionState ==
                        ConnectionState.waiting) {
                  return CircularProgressIndicator();
                }

                if (budgetSnapshot.hasData && expenseSnapshot.hasData) {
                  // Process budget and expense data here
                  // Calculate expenseTotalAmount and update UI accordingly
                  // Your logic for calculating and displaying data goes here
                }

                // Return your UI widgets here based on the calculated data
                return ListView.builder(
                  // ... rest of your ListView.builder logic
                );
              },
            );
          },
        ),
      ),
    );
  }
}

字符串

相关问题