首页 > 解决方案 > 错误:找不到正确的提供者在此 EquipmentItemWidget$ Widget 上方

问题描述


我是 Flutter 的新手(我是一名 android 开发人员),但我遇到了一个我没有解决方案的问题。## 我要做什么## 我想创建一个水平列表视图,其中有状态小部件作为项目。可以选择或取消选择这些项目。它们是页面的一部分。
[选择列表视图项目][1]
[未选择列表视图项目][2]

错误

错误:在此 EquipmentItemWidget$ 小部件上方找不到正确的提供程序

发生这种情况是因为您使用了BuildContext不包括您选择的提供者的 。有几种常见的场景:

我的代码

SearchGamePage.dart

class SearchGamePage extends StatefulWidget {
  @override
  _SearchGamePageState createState() => _SearchGamePageState();
}

class _SearchGamePageState extends State<SearchGamePage> {
  ...

  @override
  Widget build(BuildContext context) {
    ...
    return Scaffold(
        body: Container(
      margin: EdgeInsets.all(16),
      child: SingleChildScrollView(
        child: Column(
          children: [
            buttonSearch,
            inputBarSearch,
            sliderNumberPerson,
            listEquipment,
            sliderHardness
          ],
        ),
      ),
    ));
  }
}

EquipChangeNotifier.dart

class EquipChangeNotifier with ChangeNotifier {
  bool isEquip;

  EquipChangeNotifier(this.isEquip);

  //GETTER
  bool get isEquipGet => isEquip;
  //SETTER
  set isEquipSet(bool isEquip){
    this.isEquip = isEquip;
    notifyListeners();
  }
}

EquipmentItemWidget.dart

class EquipmentItemWidget extends StatefulWidget {

  final String type;

  EquipmentItemWidget({Key key, this.type}) : super(key: key);

  @override
  _EquipmentItemWidgetState createState() => _EquipmentItemWidgetState(type);
}

class _EquipmentItemWidgetState extends State<EquipmentItemWidget> {

  bool isSelected = false;
  final type;

  final List<String> urlIconEquipment = ['images/equipment/balle_ping_pong.PNG', 'images/equipment/carte.PNG', 'images/equipment/des.PNG', 'images/equipment/goblet.PNG', 'images/equipment/table.PNG'];

  _EquipmentItemWidgetState(this.type);

  String getPath(String type){
    switch(type){
      case 'balle':
        return urlIconEquipment[0];
      case 'carte':
        return urlIconEquipment[1];
      case 'des':
        return urlIconEquipment[2];
      case 'goblet':
        return urlIconEquipment[3];
      case 'table':
        return urlIconEquipment[4];
    }
  }

  void _toggleEquipmentSearch(EquipChangeNotifier notifier){
    setState(() {
      isSelected = !isSelected;
      notifier.isEquipSet = isSelected;
    });
  }

  @override
  Widget build(BuildContext context) {

    EquipChangeNotifier notifier = Provider.of<EquipChangeNotifier>(context);
    isSelected = notifier.isEquipGet;

    return GestureDetector(
      onTap: (){
        _toggleEquipmentSearch(notifier);
      },
      child: Container(
        padding: EdgeInsets.all(16),
        child: Column(
          children: [
            ClipRRect(
                borderRadius: BorderRadius.circular(300),
                child: Container(
                  padding: EdgeInsets.all(5),
                  color: Colors.white24,
                  child: (Image.asset(
                      (!isSelected?getPath(type):'images/equipment/valid.PNG'),
                    width: 50,
                    height: 50,
                    fit: BoxFit.scaleDown,
                  )),
                )),
            Container(
              margin: EdgeInsets.only(top: 8),
                child: Text(type, style: Theme.of(context).textTheme.headline6,))
          ],
        ),
      ),
    );
  }
}

预先感谢您的帮助 !!

标签: androidflutterdartlistviewprovider

解决方案


推荐阅读