无法在颤动底部表中使用范围模型,对话框
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 的位置,这在树的下方太远了。以上是关于无法在颤动底部表中使用范围模型,对话框的主要内容,如果未能解决你的问题,请参考以下文章