Flutter 颤振提供者消费者删除我的项目

Flutter 颤振提供者消费者删除我的项目,flutter,dart,Flutter,Dart,我试图构建一个排序函数来对JSON数据进行排序。 为此,我有一个按钮打开“showModalBottomSheet” 在其中,我可以选择学校班级数量的以下数据。 因此,在我的数据中,当加载到构造函数中时,我有6个教室 “我的筛选器”由按钮表示,如果筛选器包含教室编号,则这些按钮处于活动状态或不活动状态。我的代码非常有效,我的问题是,当我选择一个过滤器按钮以激活或不激活过滤器时,按钮被删除,而不是保留,而是更改颜色 我的通知者: class TablesNotifier with ChangeNo

我试图构建一个排序函数来对JSON数据进行排序。 为此,我有一个按钮打开“showModalBottomSheet”

在其中,我可以选择学校班级数量的以下数据。 因此,在我的数据中,当加载到构造函数中时,我有6个教室

“我的筛选器”由按钮表示,如果筛选器包含教室编号,则这些按钮处于活动状态或不活动状态。我的代码非常有效,我的问题是,当我选择一个过滤器按钮以激活或不激活过滤器时,按钮被删除,而不是保留,而是更改颜色

我的通知者:

class TablesNotifier with ChangeNotifier {

  // Services
  // ---------------------------------------------------------------------------
  final jsonSelectorService = locator<JsonSelectorService>();

  // Variables
  // ---------------------------------------------------------------------------
  //all data from my classerooms in JSON
  List<ClassroomModel> classrooms;
  // Data that I will display and reconstruct based on my filter parameters
  List<ClassroomModel> classroomsFiltered; 
  List<int> numberOfClassrooms = List(); 
  // Model which will store the parameters of my filters and as a function I will load the data to display
  FilterClassroomsModel filterClassroomsModel = FilterClassroomsModel();

  // Constructor
  // ---------------------------------------------------------------------------

  TablesNotifier(){
    _initialise();
  }

  // Initialisation
  // ---------------------------------------------------------------------------
  Future _initialise() async{
    classrooms = await jsonSelectorService.classrooms('data');
    classroomsFiltered = classrooms ;

    // I install the number of existing classrooms
    // Here the result is [1,2,3,4,5,6]
    classrooms.forEach((element) {
      if(!numberOfClassrooms.contains(element.type)){
        numberOfClassrooms.add(element.type);
      }
    });

    // I install the number of classrooms activated by default in my filter
    // As I decide to display all my classrooms by default
    // My filter on the classrooms must contain all the loaded classrooms
    filterClassroomsModel.classrooms = numberOfClassrooms;
    notifyListeners();
  }

  // Functions public
  // ---------------------------------------------------------------------------
  void saveClassroomsSelected(int index)
  {
    // Here my classroom model also contains the numbers of the classrooms that I want to filter
    if(filterClassroomsModel.classrooms.contains(index)){
      filterClassroomsModel.classrooms.remove(index);
    }else{
      filterClassroomsModel.classrooms.add(index);
    }
    notifyListeners();
  }
}
class TableScreen extends StatelessWidget {
  final String title;
  TableScreen({Key key, @required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      drawer: MenuDrawerComponent.builder(context),
      appBar: AppBar(
        backgroundColor: AppColors.backgroundDark,
        elevation: 0,
        centerTitle: true,
        title: Text(title),
      ),
      floatingActionButton: FloatingActionButton.extended(
        icon: Icon(Icons.sort),
        label: Text('Filter'),
        onPressed: () async{
          slideSheet(context);
        },
        backgroundColor: AppColors.contrastPrimary,
      ),
      body: _buildBody(context),
    );
  }

  Widget _buildBody(BuildContext context)
  {
    var _tableProvider = Provider.of<TablesNotifier>(context);

    if(_tableProvider.chargesFiltered == null){
      return Center(
        child: CircularProgressIndicator(
          backgroundColor: AppColors.colorShadowLight,
        ),
      );
    }else{
      return Column(
        children: <Widget>[
          Expanded(
            child: Container(
              padding: EdgeInsets.only(top: 10, right : 20, left : 20),
              child: ListView.builder(
                itemCount: _tableProvider.classroomsFiltered.length,
                itemBuilder: (context, index){
                  return Container(
                    child: Column(
                      children: [
                        Row(
                            // Some classrooms data
                        ),
                      ],
                    ),
                  );
                },
              ),
            )
          ),
        ],
      );
    }
  }

  void slideSheet(BuildContext context) {
    var _tableProvider = Provider.of<TablesNotifier>(context, listen:false);

    showModalBottomSheet(
        context: context,
        isScrollControlled: true,
        isDismissible: true,
        builder: (context) {
          return Wrap(
            children: [
              Container(
                color: Color(0xFF737373),
                child: Container(                 
                  child: Column(
                    children: <Widget>[
                      // Some filters ...
                      // Here I want to rebuild the list of button for show the changes
                      ChangeNotifierProvider.value(
                        value: _tableProvider,
                        child: Consumer<TablesNotifier>(
                            builder: (context, model, child){
                              return _listOfClassrooms(context);
                            }
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ]
          );
        });
  }

  Widget _listOfClassrooms(BuildContext context){
    var _tableProvider = Provider.of<TablesNotifier>(context);

    List<Widget> list = List<Widget>();
    var listClassrooms = _tableProvider.numberOfClassrooms;
    var filterClassrooms = _tableProvider.filterClassroomsModel.classrooms;

    for (var i = 0; i < listClassrooms.length; i++) {
      int selectIndex = 0;
      if(filterClassrooms.contains(listClassrooms[i])){
        selectIndex = listClassrooms[i];
      }

      list.add(
        RadioComponent(
            text: "${listClassrooms[i]}",
            index: listClassrooms[i],
            width: (MediaQuery.of(context).size.width - 56) /3,
            selectedIndex: selectIndex,
            onPressed: _tableProvider.saveChargesSelected,
          ),
      );
    }
    return Wrap(
        spacing: 8.0, // gap between adjacent chips
        runSpacing: 8.0, // gap between lines
        children: list
    );
  }
}
class FilterClassroomsModel {
  int order;
  int sort;
  List<int> classrooms;

  FilterClassroomsModel ({
    this.order = 0,
    this.sort = 0,
    this.classrooms = const[], 
  });

  @override
  String toString() {
    return '{ '
        '${this.order}, '
        '${this.sort}, '
        '${this.classrooms}, '
        '}';
  }
}
我正在失去课堂计算的动态方面,这不适合我。但我不理解这种行为。

我的观点:

class TablesNotifier with ChangeNotifier {

  // Services
  // ---------------------------------------------------------------------------
  final jsonSelectorService = locator<JsonSelectorService>();

  // Variables
  // ---------------------------------------------------------------------------
  //all data from my classerooms in JSON
  List<ClassroomModel> classrooms;
  // Data that I will display and reconstruct based on my filter parameters
  List<ClassroomModel> classroomsFiltered; 
  List<int> numberOfClassrooms = List(); 
  // Model which will store the parameters of my filters and as a function I will load the data to display
  FilterClassroomsModel filterClassroomsModel = FilterClassroomsModel();

  // Constructor
  // ---------------------------------------------------------------------------

  TablesNotifier(){
    _initialise();
  }

  // Initialisation
  // ---------------------------------------------------------------------------
  Future _initialise() async{
    classrooms = await jsonSelectorService.classrooms('data');
    classroomsFiltered = classrooms ;

    // I install the number of existing classrooms
    // Here the result is [1,2,3,4,5,6]
    classrooms.forEach((element) {
      if(!numberOfClassrooms.contains(element.type)){
        numberOfClassrooms.add(element.type);
      }
    });

    // I install the number of classrooms activated by default in my filter
    // As I decide to display all my classrooms by default
    // My filter on the classrooms must contain all the loaded classrooms
    filterClassroomsModel.classrooms = numberOfClassrooms;
    notifyListeners();
  }

  // Functions public
  // ---------------------------------------------------------------------------
  void saveClassroomsSelected(int index)
  {
    // Here my classroom model also contains the numbers of the classrooms that I want to filter
    if(filterClassroomsModel.classrooms.contains(index)){
      filterClassroomsModel.classrooms.remove(index);
    }else{
      filterClassroomsModel.classrooms.add(index);
    }
    notifyListeners();
  }
}
class TableScreen extends StatelessWidget {
  final String title;
  TableScreen({Key key, @required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      drawer: MenuDrawerComponent.builder(context),
      appBar: AppBar(
        backgroundColor: AppColors.backgroundDark,
        elevation: 0,
        centerTitle: true,
        title: Text(title),
      ),
      floatingActionButton: FloatingActionButton.extended(
        icon: Icon(Icons.sort),
        label: Text('Filter'),
        onPressed: () async{
          slideSheet(context);
        },
        backgroundColor: AppColors.contrastPrimary,
      ),
      body: _buildBody(context),
    );
  }

  Widget _buildBody(BuildContext context)
  {
    var _tableProvider = Provider.of<TablesNotifier>(context);

    if(_tableProvider.chargesFiltered == null){
      return Center(
        child: CircularProgressIndicator(
          backgroundColor: AppColors.colorShadowLight,
        ),
      );
    }else{
      return Column(
        children: <Widget>[
          Expanded(
            child: Container(
              padding: EdgeInsets.only(top: 10, right : 20, left : 20),
              child: ListView.builder(
                itemCount: _tableProvider.classroomsFiltered.length,
                itemBuilder: (context, index){
                  return Container(
                    child: Column(
                      children: [
                        Row(
                            // Some classrooms data
                        ),
                      ],
                    ),
                  );
                },
              ),
            )
          ),
        ],
      );
    }
  }

  void slideSheet(BuildContext context) {
    var _tableProvider = Provider.of<TablesNotifier>(context, listen:false);

    showModalBottomSheet(
        context: context,
        isScrollControlled: true,
        isDismissible: true,
        builder: (context) {
          return Wrap(
            children: [
              Container(
                color: Color(0xFF737373),
                child: Container(                 
                  child: Column(
                    children: <Widget>[
                      // Some filters ...
                      // Here I want to rebuild the list of button for show the changes
                      ChangeNotifierProvider.value(
                        value: _tableProvider,
                        child: Consumer<TablesNotifier>(
                            builder: (context, model, child){
                              return _listOfClassrooms(context);
                            }
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ]
          );
        });
  }

  Widget _listOfClassrooms(BuildContext context){
    var _tableProvider = Provider.of<TablesNotifier>(context);

    List<Widget> list = List<Widget>();
    var listClassrooms = _tableProvider.numberOfClassrooms;
    var filterClassrooms = _tableProvider.filterClassroomsModel.classrooms;

    for (var i = 0; i < listClassrooms.length; i++) {
      int selectIndex = 0;
      if(filterClassrooms.contains(listClassrooms[i])){
        selectIndex = listClassrooms[i];
      }

      list.add(
        RadioComponent(
            text: "${listClassrooms[i]}",
            index: listClassrooms[i],
            width: (MediaQuery.of(context).size.width - 56) /3,
            selectedIndex: selectIndex,
            onPressed: _tableProvider.saveChargesSelected,
          ),
      );
    }
    return Wrap(
        spacing: 8.0, // gap between adjacent chips
        runSpacing: 8.0, // gap between lines
        children: list
    );
  }
}
class FilterClassroomsModel {
  int order;
  int sort;
  List<int> classrooms;

  FilterClassroomsModel ({
    this.order = 0,
    this.sort = 0,
    this.classrooms = const[], 
  });

  @override
  String toString() {
    return '{ '
        '${this.order}, '
        '${this.sort}, '
        '${this.classrooms}, '
        '}';
  }
}
据此:

filter.classrooms = List<int>();
filter.classrooms.addAll(numberOfClassrooms);
filter.clicks=List();
filter.questions.addAll(numberofthequestions);
更改此选项:

filterClassroomsModel.classrooms = numberOfClassrooms;    
致:

更新(您也可以这样做):

filterClassroomsModel.questions=new List();
filterClassroomsModel.Questions.addAll(教室数);

您说过引用NumberOfQuothers不起作用,但[1,2,3,4,5,6]起作用,对吗?我对颤振知之甚少,但您是否可以尝试调试/记录“NumberOfQuestions”列表以查看其是否正确填充?初始化期间,变量“number Of Questions”已正确填充。这是在重建过程中与供应商,这个变量的变化,但我不明白为什么。如果我直接在列表中输入类的值,因为它不是一个命名变量,之后不会更改。它不起作用。我有一个错误:“不支持的操作:无法添加到不可修改的列表”。我通过添加我的模型来编辑我的帖子。我花了一个晚上在上面,我不明白如果我修改“filterClassroomsModel”变量,为什么我的“NumberOfQuestions”变量会被修改……这是因为这个filterClassroomsModel.Questions=NumberOfQuestions;将其更新为:FilterClassroomsModel({this.order=0,this.sort=0,this.questions=[],});我不明白为什么要放这个?我的filterClassroomsModel在通知程序的变量部分初始化:“filterClassroomsModel filterClassroomsModel=filterClassroomsModel();”。当我在构造函数中初始化它时,我希望默认情况下我的模型的空列表(filterClassroomsModel.questions)被“NumberOfQuestions”提供的可用教室列表替换。这在初始化时起作用,但在更新filterClassroomsModel列表时不起作用,该列表应仅包含我希望用于筛选器的教室编号。例如,如果我删除了列表中的数字3,那么我的NumberOfQuorks也会更改,我不明白为什么。这会使数字3按钮消失。
filterClassroomsModel.classrooms= new List<int>(); 
filterClassroomsModel.classrooms.addAll(numberOfClassrooms);