2

当我运行此代码时,它显示一个错误,即未找到正确的 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();
            } 
            },
            ),
          );
                    }
        ),
       ); 
      }
    }
4

2 回答 2

1

在您的应用程序的根目录下,您需要使用它来启动它。这允许您使用树中较低的 ScopedModelDescendent 小部件。

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

无论您在哪里显示您的资源,请确保它像上面一样包裹,然后您就可以在树的较低位置使用该模型。

于 2019-03-23T16:42:00.407 回答
0

范围模型将其包装到页面时,仅适用于该页面。底部工作表和对话框除了创建新的上下文(即一个新页面)之外什么都没有,因此我们必须包裹在材料应用程序的顶部,或者将另一个范围模型包裹在具有相同模型的底部工作表上。那应该工作。并且在 Ur 代码中,我认为在模型中调用了一个函数。然后模型一次又一次地构建,所以把它改成这样

onpressed:(){
call funtion;
pop;
}

我认为这可能对某些人有所帮助

于 2019-03-28T06:40:48.903 回答