невозможно использовать модель с прицелом на нижнем листе флаттера, в диалогах

когда я запускаю этот код, он показывает ошибку, что правильная модель области видимости не найдена. я думаю, что мы должны объявить другую модель с областью действия для нижнего листа, диалоги также сделали это, используя ту же модель, но она ведет себя ненормально. как мне добиться этого, как использовать модели с областью видимости в таких нижних листах и ​​диалогах.

я был нубом в модели с прицелом, любая помощь приветствуется

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';


    class ResourcesModel extends Model{
      String selectsubject = 'Select the subject';
      List<String> sublist=[];
      change(int index){
        debugPrint('${sublist[index]}');
        selectsubject=sublist[index];
        notifyListeners();
      }
      fetchsubjects() {
      Firestore.instance.collection("resources").document("17csea").get().then((DocumentSnapshot ds){
        for (var item in ds['subjects']) {
          sublist.add(item);
        }
        notifyListeners();
      });
      }
    }

    class Resources extends StatelessWidget {
    final ResourcesModel resourcesModel =ResourcesModel();

    void showbottomsheet(context) async{
      double height =MediaQuery.of(context).size.height;
    await showModalBottomSheet(
      context: context,
      builder: (context){
        return Container(
            height: height/2,
            child: ScopedModelDescendant<ResourcesModel>(
              builder:(context,_,model){ 
                debugPrint('helelel');
                return (model.sublist.isEmpty)?Center(child:CircularProgressIndicator()):
                ListView.separated(
                  itemCount: model.sublist.length,
                  separatorBuilder: (context,_){
                    return Divider(
                      color: Theme.of(context).primaryColor,
                    );
                  },
                  itemBuilder: (context,index){
                    return ListTile(
                      title: Text(model.sublist[index]),
                      onTap: model.change(index),
                    );
                  },
                );
              }
            ),
          );
      }
    );
    }
      @override
      Widget build(BuildContext context) {
        return ScpedModel<ResourcesModel>(
        model:resourcesmodel,
        chilld:ScopedModelDescendant<ResourcesModel>(

                    builder:(context,_,model){ 
                      return Container(
            color: Color(0xFFF3F3F3),
            child: RaisedButton(
          child: Text(model.selectsubject),
          onPressed: (){
            if(resourcesModel.sublist.isEmpty){
              resourcesModel.fetchsubjects();
            } 
            },
            ),
          );
                    }
        ),
       ); 
      }
    }

person Saikumarreddy2391    schedule 23.03.2019    source источник


Ответы (2)


Scoped Model, когда она обернута на страницу, тогда она применима только к этой странице. нижние листы и диалоги в трепещущем не что иное, как создание нового контекста, то есть новой страницы, поэтому либо мы должны обернуть поверх приложения материала, либо обернуть другую модель с областью действия на нижний лист с той же моделью. это должно работать. а в коде Ура есть это нажатие, вызывающее функцию в модели, я так думаю. затем модель строится снова и снова, поэтому измените ее на такую

onpressed:(){
call funtion;
pop;
}

я думаю, что это может быть полезно для некоторых может быть

person Saikumarreddy atluri    schedule 28.03.2019

В корне вашего приложения вам нужно запустить его с помощью. Это позволяет вам использовать виджеты ScopedModelDescentent ниже в дереве.

ScopedModel<AppModel>(
    model: AppModel(),
    child: Resources())

Где бы вы ни отображали свои ресурсы, убедитесь, что они упакованы, как указано выше, тогда вы сможете использовать эту модель ниже в своем дереве.

person Filled Stacks    schedule 23.03.2019
comment
извините, я отредактировал свой вопрос, он уже был в верхней части дерева виджетов, и такая же ошибка. ошибка отображается на нижнем листе, говоря, что не удалось найти правильную модель с областью действия, как только попытайтесь запустить этот код в вашем редакторе, чтобы получить меня - person Saikumarreddy2391; 24.03.2019
comment
@Saikumarreddy2391 Не в ваших ресурсах корень, в котором отображается виджет «Ресурсы». Где вы показываете виджет ресурсов? Что выводит на экран. Место, где вы помещаете его на экран, должно быть окружено кодом, который у меня есть в моем ответе. Ребенок, которого вы хотите сделать потомком, должен быть только потомком, он не должен предоставлять свою собственную модель. В этом весь смысл использования модели с областью видимости. - person Filled Stacks; 24.03.2019
comment
я использую панель вкладок, и весь код выше был второй вкладкой - person Saikumarreddy2391; 24.03.2019
comment
Хорошо. Не могли бы вы опубликовать код, добавляющий ресурсы на экран. - person Filled Stacks; 24.03.2019
comment
@ Saikumarreddy2391 Сайкумарредди2391 кажется, ты не понимаешь, о чем я спрашиваю, поэтому я не смогу тебе помочь. Надеюсь, вы разберетесь с этим. И если ты поймешь это, я попробую еще раз. Место, где вы добавляете свой виджет Resources, — это место, где вам нужно указать ScopedModel. НЕ в представлении ресурсов. Это слишком далеко вниз по дереву. Место, где вы размещаете свои ресурсы в дереве виджетов, — это то место, где вы должны указать ScopedModel, НЕ в вашем виджете ресурсов, это слишком далеко вниз по дереву. - person Filled Stacks; 24.03.2019
comment
@ Saikumarreddy2391 Если вы все еще боретесь с этой концепцией, я настоятельно рекомендую создать собственную унаследованную модель, чтобы понять, почему существует ScopedModel. - person Filled Stacks; 24.03.2019
comment
K мое дерево виджетов - это сначала каркас, затем tabbarview, затем есть 3 вкладки, приведенный выше код относится ко 2-й вкладке. - person Saikumarreddy2391; 24.03.2019
comment
Должен ли я добавить scopedmodel над панелью вкладок или каркасом? - person Saikumarreddy2391; 24.03.2019
comment
я обернул только 2-ю вкладку с моделью с прицелом, это правильный способ или его следует обернуть над каркасом и панелью вкладок. - person Saikumarreddy2391; 24.03.2019