невозможно использовать модель с областью видимости в нижнем листе флаттера, диалогов - PullRequest
1 голос
/ 23 марта 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 23 марта 2019

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

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

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

0 голосов
/ 28 марта 2019

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

onpressed:(){
call funtion;
pop;
}

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

...