无法在颤动底部表中使用范围模型,对话框

Posted

技术标签:

【中文标题】无法在颤动底部表中使用范围模型,对话框【英文标题】:unable to use scoped model in flutter bottom sheet,dialogs 【发布时间】:2019-08-14 09:33:37 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

onpressed:()
call funtion;
pop;

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

对不起,我编辑了我的问题,我已经在小部件树的顶部找到了同样的错误。错误显示在底部表格中,说一旦尝试在您的编辑器中运行此代码以获取我,就找不到正确的作用域模型 @Saikumarreddy2391 不在您的资源中显示您的资源小部件的根目录。您在哪里显示资源小部件?是什么把它放在屏幕上。你把它放在屏幕上的地方应该被我在回答中的代码包围。你想成为后代的孩子应该只是一个后代,它不应该提供它自己的模型。这就是使用作用域模型的全部意义所在。 我正在使用标签栏,上面的整个代码是第二个标签 好的。你能发布将资源添加到屏幕上的代码 @Saikumarreddy2391 你似乎不明白我在问什么,所以我无法帮助你。我希望你能解决这个问题。如果你能理解,我会再试一次。添加资源小部件的位置是您需要提供 ScopedModel 的位置。 NOT 在资源视图中。这在树下太远了。 您在小部件树中放置资源的位置 是您应该在资源小部件中提供 ScopedModel NOT 的位置,这在树的下方太远了。

以上是关于无法在颤动底部表中使用范围模型,对话框的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中增加模态底部表中的购物车值

如何使用此按钮中的条件在颤动中显示警报对话框?

在颤动中打开对话框时检测返回按钮按下

在嵌套的 MaterialApp 中显示对话框 - 颤动

如何在颤动中显示带有动画的自定义对话框?

颤动中带有圆角的警报对话框