使用ChangeNotifier的Flutter State不维持State

时间:2020-09-12 04:54:07

标签: flutter

TLDR,我正在构建一个Stock Screener,当我从一个小部件访问一个表时,它将呈现适当的状态,但是当从类中调用时,该状态默认为初始值(我认为)。

总体设计概念是用户配置其股票筛选器,然后单击页面底部的“屏幕”按钮。

这是一个查看示例。这是使用Consumerclass ScreenerController extends ChangeNotifier

检索状态的市值选择器小部件。
class CapSelectorWidget extends StatelessWidget {
  Widget capButton(capSelection) {
    return Consumer<ScreenerController>(builder: (context, capData, child) {
      return GestureDetector(
        child: Container(
          padding: EdgeInsets.all(12.0),
          margin: EdgeInsets.all(6.0),
          decoration: BoxDecoration(
            color: capData.getColor(capSelection),
            borderRadius: BorderRadius.circular(8.0),
          ),
          child: Text(
            capSelection,
            textAlign: TextAlign.center,
          ),
        ),
        onTap: () {
          capData.toggleCapSelection(capSelection);
        },
      );
    });
  }

方法getColor和toggleCapSelection最终都引用和/或更新以下_capColorList。这是_capColorListtoggleCapSelection

的代码
class ScreenerController extends ChangeNotifier {
  //////////////////////
  // Market Cap Widget
  //////////////////////
  Map _capColorList = {
    'Micro Cap': {
      'isSelected': true,
      'selectedColor': Colors.teal[300],
      'unSelectedColor': Colors.white38,
    },
    'Small Cap': {
      'isSelected': true,
      'selectedColor': Colors.teal[400],
      'unSelectedColor': Colors.white38,
    },
    'Mid Cap': {
      'isSelected': true,
      'selectedColor': Colors.teal[500],
      'unSelectedColor': Colors.white38,
    },
    'Large Cap': {
      'isSelected': true,
      'selectedColor': Colors.teal[600],
      'unSelectedColor': Colors.white38,
    },
  };

void toggleCapSelection(String capType) {
    // Flip bool selected value
    _capColorList[capType]['isSelected'] =
        !_capColorList[capType]['isSelected'];
    notifyListeners();
    print(capType + ' ' + _capColorList[capType]['isSelected'].toString());
};

etc...

到目前为止一切顺利。当用户点击一个Cap Bucket时,它将切换状态,并且颜色将更新。

现在,当用户点击页面底部的“屏幕”(即“提交”)时,将实现此代码。

child: FlatButton(
                      child: Text('Screen', textAlign: TextAlign.center),
                      onPressed: () {
                        ScreenerController().screenStocks();

                        //Todo: Figure out why Provider.of doesn't work on Screen Button
                        //Provider.of<ScreenerController>(context, listen: false)
                        //    .screenStocks();
                      },
                    ),

我实现以下代码,以将市值存储桶列表创建为列表。

我的假设是,因为Provider.of不适用于FlatButton(它位于同一ChangeNotifierProvider树中),所以我无意中创建了一个新实例。

Map screenerQueryBuilder() {
    
    //If Cap Button is selected, add it to selectedCaps
    List<String> selectedCaps = [];
    for (String cap in _capColorList.keys) {
      print(cap + _capColorList[cap]['isSelected'].toString());

      if (_capColorList[cap]['isSelected']) {
        selectedCaps.add(cap);
      }
    }

    print(selectedCaps);

问题是,即使假设用户单击“屏幕”时未选择“中键”和“微键”按钮,当我在_capColorList.keys上进行迭代时,值始终为true,因此始终将其添加到selectedCaps列表中。

也许有人知道这是为什么吗?

提前谢谢!

0 个答案:

没有答案