TLDR,我正在构建一个Stock Screener,当我从一个小部件访问一个表时,它将呈现适当的状态,但是当从类中调用时,该状态默认为初始值(我认为)。
总体设计概念是用户配置其股票筛选器,然后单击页面底部的“屏幕”按钮。
这是一个查看示例。这是使用Consumer
从class 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
。这是_capColorList
和toggleCapSelection
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
列表中。
也许有人知道这是为什么吗?
提前谢谢!