невозможно использовать модель с ограниченной областью в flutter bottom sheet, диалоги

#dart #flutter #state #scoped-model

#dart #flutter #состояние #модель с ограниченной областью

Вопрос:

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

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

     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();
            } 
            },
            ),
          );
                    }
        ),
       ); 
      }
    }
  

Ответ №1:

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

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

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

Комментарии:

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

2. @Saikumarreddy2391 Нет в ваших ресурсах корня, в котором отображается ваш виджет ресурсов. Где вы показываете виджет ресурсов? Что выводит ее на экран. Место, где вы выводите его на экран, должно быть окружено кодом, который у меня есть в моем ответе. Потомок, которого вы хотите сделать потомком, должен быть только потомком, он не должен предоставлять свою собственную модель. В этом весь смысл использования модели с ограниченной областью.

3. я использую панель вкладок, и весь приведенный выше код был второй вкладкой

4. Хорошо. Можете ли вы опубликовать код, который добавляет ресурсы на экран .

5. @Saikumarreddy2391 вы, кажется, не понимаете, о чем я спрашиваю, поэтому я не смогу вам помочь. Я надеюсь, вы разобрались с этим. И, если вы это поймете, я попробую еще раз. Место, куда вы добавляете свой виджет ресурсов, — это то, где вам нужно указать ScopedModel. НЕ внутри представления ресурсов. Это слишком далеко вниз по дереву. Место, куда вы помещаете свои ресурсы в дереве виджетов, — это то, где вы должны указать ScopedModel, А НЕ в вашем виджете ресурсов, это слишком далеко вниз по дереву.

Ответ №2:

Модель с ограниченной областью действия, когда переносится на страницу, тогда она применима только к этой странице. нижние листы и диалоги во flutter ничего, кроме создания нового контекста, т. Е. новой страницы, поэтому либо мы должны обернуть поверх приложения material, либо обернуть другую модель с ограниченной областью на нижнем листе с той же моделью. это должно сработать. и в вашем коде у вас есть это onpressed, вызывающее функцию в модели, я так думаю. затем модель строится снова и снова, поэтому измените ее следующим образом

 onpressed:(){
call funtion;
pop;
}
  

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