颤动中的更新状态

时间:2020-08-21 18:13:14

标签: flutter setstate

我有一个对话框,在主屏幕上对列表进行排序。当我按更新时,列表将正确排序。

我需要做的是在整个主屏幕上运行setState,以便其他小部件将反映排序顺序的更改。

具体地说,当按下更新按钮时,我需要重建两个小部件。

我试图将一个函数从按钮传递到构造函数中的主屏幕,并创建了一个函数给setState,但这没用。

请让我知道我是否足够清楚。谢谢

首页:



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              SizedBox(
                height: 30,
              ),
              HpHeader(),
              SizedBox(height: 30),
              QuoteBox(),
              SizedBox(height: 30),  
              //parent          
              MainDebtDebt(),
              SizedBox(height: 30),
              AdCard(),
              //child
              AllDebtsCard(),

所有债务卡(按钮位于此处):

import 'package:debt_zero_2/classes/min_debt_class.dart';
//import 'package:debt_zero_2/classes/icon_class.dart';
import 'package:debt_zero_2/widgets/provider_widget.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:shared_preferences/shared_preferences.dart';

class AllDebtsCard extends StatefulWidget {
  @override
  _AllDebtsCardState createState() => _AllDebtsCardState();
}

class _AllDebtsCardState extends State<AllDebtsCard> {
  int debtValue = 1;

  int group;

  void setValues() async {
    SharedPreferences sharedPrefs = await SharedPreferences.getInstance();
    final uid = await Provider.of(context).auth.getUidPref();
    final db = Firestore.instance;
    setState(() {
      sharedPrefs.setInt('sortBySnowOrAva', debtValue);
      SetMainDebt().setMainDebt();
    });

    db
        .collection('userPreferences')
        .document(uid)
        .updateData({'sortBySnowOrAva': debtValue});
  }

  getValues() async {
    SharedPreferences sharedPrefs = await SharedPreferences.getInstance();
    int intValue = sharedPrefs.getInt('sortBySnowOrAva');

    return intValue;
  }

  restore() async {
    final SharedPreferences sharedPrefs = await SharedPreferences.getInstance();
    setState(() {
      group = (sharedPrefs.getInt('sortBySnowOrAva') ?? false);
    });
  }

  final dbPath = Firestore.instance.collection('userDebts');

  Stream<QuerySnapshot> dbStream(BuildContext context) async* {
    final uid = await Provider.of(context).auth.getUidPref();
    final intValues = await getValues();
    yield* intValues == 1
        ? dbPath
            .document(uid)
            .collection('debts')
            .orderBy('balance')
            .snapshots()
        : dbPath
            .document(uid)
            .collection('debts')
            .orderBy('interest', descending: true)
            .snapshots();
  }

  @override
  void initState() {
    super.initState();
    restore();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        RaisedButton(
          child: Text('SORT'),
          onPressed: () {
            showDialog(
                barrierDismissible: false,
                context: context,
                builder: (BuildContext context) {
                  return StatefulBuilder(
                    builder: (context, setState) {
                      return AlertDialog(
                        title: Text('Sort Debts By:'),
                        content: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: <Widget>[
                            RadioListTile(
                              value: 1,
                              secondary: IconButton(
                                onPressed: () {
                                  showDialog(
                                      context: context,
                                      builder: (BuildContext context) {
                                        return AlertDialog(
                                          title: Text('Debt Snowball:'),
                                          content: Text(
                                              'This is an explanation of debt snowball'),
                                          actions: <Widget>[
                                            FlatButton(
                                              child: Text('OK'),
                                              onPressed: () {
                                                Navigator.pop(context);
                                              },
                                            )
                                          ],
                                        );
                                      });
                                },
                                icon: Icon(Icons.help_outline),
                              ),
                              title: Text('Snowball'),
                              groupValue: group,
                              onChanged: (T) {
                                setState(() {
                                  group = T;
                                  debtValue = 1;
                                });
                              },
                            ),
                            RadioListTile(
                              value: 2,
                              title: Text('Avalanche'),
                              secondary: IconButton(
                                onPressed: () {},
                                icon: Icon(Icons.help_outline),
                              ),
                              groupValue: group,
                              onChanged: (T) {
                                setState(() {
                                  group = T;
                                  debtValue = 2;
                                });
                              },
                            )
                          ],
                        ),
                        actions: <Widget>[
                          FlatButton(
                            onPressed: () async {
                              setState(() {
                                setValues();
                              });
                              Navigator.pop(context);
                            },
                            child: Text('UPDATE'),
                          ),
                          FlatButton(
                            child: Text(
                              'CANCEL',
                              style: TextStyle(color: Colors.red),
                            ),
                            onPressed: () {
                              Navigator.pop(context);
                            },
                          ),
                        ],
                      );
                    },
                  );
                }).then((value) => setState(() {}));
          },
        ),
        StreamBuilder<QuerySnapshot>(
            stream: dbStream(context),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                final debts = snapshot.data.documents;
                List<Widget> debtWidgets = [];
                for (var debt in debts) {
                  final debtName = debt.data['name'];
                  final debtType = debt.data['type'];
                  final debtBalance = debt.data['balance'];
                  final debtDue = debt.data['due'].toDate();

                  final debtWidget = Card(
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        Text('$debtType'),
                        Text('$debtName'),
                        Text(DateFormat.MMMd().format(debtDue)),
                        Text('$debtBalance'),
                        FlatButton(
                          child: Text(
                            'DELETE',
                            style: TextStyle(color: Colors.red),
                          ),
                          onPressed: () {
                            //When I delete a debt I need to update the 'debtMinimum' field in prefs and firestore
                          },
                        )
                      ],
                    ),
                  );

                  debtWidgets.add(debtWidget);
                }
                return Column(children: debtWidgets);
              }
              return Container();
            }),
      ],
    );
  }
}

我需要更新的两个小部件之一:

import 'dart:async';

//import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:debt_zero_2/classes/icon_class.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class MainDebtDebt extends StatefulWidget {

  
  @override
  _MainDebtDebtState createState() => _MainDebtDebtState();
}

class _MainDebtDebtState extends State<MainDebtDebt> {
   
   bool thenum = true;

  static DebtModel debtIcons = DebtModel();
  bool getGoalType = true;
  double balance = 0.0;
  String name = '';
  String type = ''; 
  int numOfDebts = 0;
  double safetyBalance = 0.0;

  double mainSnowballOpeningBalance = 0.0;

 

  Future<void> getGoalTypeFlag() async {
    final SharedPreferences preferences = await SharedPreferences.getInstance();
    final sortBy = preferences.getInt('sortBySnowOrAva');
    setState(() {
       if (sortBy == 1){
      balance = preferences.getDouble('mainDebtFieldSnowball');
      type = preferences.getString('mainDebtFieldSnowballType');
      name = preferences.getString('mainDebtFieldSnowballName');}

       if (sortBy == 2){
      balance = preferences.getDouble('mainAvalancheBalance');
      type = preferences.getString('mainAvalancheBalanceType');
      name = preferences.getString('mainAvalancheBalanceName');
       }

      mainSnowballOpeningBalance = preferences.getDouble('openingBalance');  

      safetyBalance = preferences.getDouble('safetyBalance');
      getGoalType = preferences.getBool('mainGoalIsDebts');
      numOfDebts = preferences.getInt('numberOfDebts');     
    
    });
  }



  @override
  void initState() {
    super.initState();
    getGoalTypeFlag();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      decoration: BoxDecoration(border: Border.all()),
      child: Column(
        children: <Widget>[
          Text(getGoalType
              ? 'I\'m Knocking Out This Payment:'
              : 'I\'m Building My Safety Fund'),
          SizedBox(
            height: 15,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                getGoalType
                    ? debtIcons.getDebtIcon(type)
                    : '?',
                style: TextStyle(fontSize: 30),
              ),
              SizedBox(
                width: 20,
              ),
              Text(getGoalType ? name : 'Safety Fund'),
            ],
          ),
          SizedBox(
            height: 15,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(getGoalType ? 'Remaining Balance:' : 'Saved:'),
              SizedBox(
                width: 15,
              ),
              Text(getGoalType
                  ? '\$' + balance.toStringAsFixed(0)
                  : safetyBalance.toStringAsFixed(0))
            ],
          ),
          SizedBox(
            height: 15,
          ),
          Column(
            children: <Widget>[
              Text('Current Progress:'),
              SizedBox(
                height: 10,
              ),
              Container(
                decoration: BoxDecoration(border: Border.all()),
                height: 22,
                width: 202,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Flexible(
                      child: FractionallySizedBox(
                        widthFactor: .75,
                        //fix this
                        // 1 - mainSnowballBalance / mainSnowballOpeningBalance,
                        child: Container(
                          color: Colors.green,
                        ),
                      ),
                    )
                  ],
                ),
              ),
              SizedBox(
                height: 15,
              ),
              RaisedButton(
                child: Text(getGoalType ? 'MAKE A PAYMENT' : 'MAKE A DEPOSIT'),
                onPressed: () {
                  Navigator.of(context).pushNamed('/makePayment');
                },
              ),
              SizedBox(
                height: 30,
              ),
              RaisedButton(
                child: Text('GET DATA'),
                onPressed: ()async {
                 
                  SharedPreferences pref = await SharedPreferences.getInstance();
                      

                    String thenum = pref.getString('mainAvalancheBalanceType1');
                    //pref.setBool('isInOb', null);
                    print(thenum);
                  
                },
              ),
            ],
          )
        ],
      ),
    );
  }
}





0 个答案:

没有答案