无法在 flutter bottom sheet,dialogs 中使用范围模型
unable to use scoped model in flutter bottom sheet,dialogs
当我 运行 此代码时,它显示错误,未找到正确的 scopedmodel。我认为我们必须声明另一个作用域模型
bottomsheet,dialogs 也使用相同的模型进行了此操作,但它表现异常。我如何实现如何在此类底部工作表和对话框中使用范围模型。
我对范围模型一窍不通
感谢任何帮助
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();
}
},
),
);
}
),
);
}
}
您需要在应用程序的根目录下启动它。这允许您使用树中较低的 ScopedModelDescendent 小部件。
ScopedModel<AppModel>(
model: AppModel(),
child: Resources())
无论您在何处显示您的资源,请确保它像上面那样包装,然后您将能够在您的树中使用该模型。
Scoped Model 将其包装到页面时,它仅适用于该页面。
底部 sheets 和对话框中的 flutter 只是创建新的上下文,即一个新页面,所以我们要么必须包装在 material 应用程序的顶部,要么将另一个作用域模型包装在底部 sheet 上模型。那应该工作。在你的代码中,你有压力在模型中调用一个函数,我认为是这样。
然后模型一次又一次地建立,所以把它改成这样
onpressed:(){
call funtion;
pop;
}
我认为这可能对某些人有帮助
当我 运行 此代码时,它显示错误,未找到正确的 scopedmodel。我认为我们必须声明另一个作用域模型 bottomsheet,dialogs 也使用相同的模型进行了此操作,但它表现异常。我如何实现如何在此类底部工作表和对话框中使用范围模型。
我对范围模型一窍不通 感谢任何帮助
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();
}
},
),
);
}
),
);
}
}
您需要在应用程序的根目录下启动它。这允许您使用树中较低的 ScopedModelDescendent 小部件。
ScopedModel<AppModel>(
model: AppModel(),
child: Resources())
无论您在何处显示您的资源,请确保它像上面那样包装,然后您将能够在您的树中使用该模型。
Scoped Model 将其包装到页面时,它仅适用于该页面。 底部 sheets 和对话框中的 flutter 只是创建新的上下文,即一个新页面,所以我们要么必须包装在 material 应用程序的顶部,要么将另一个作用域模型包装在底部 sheet 上模型。那应该工作。在你的代码中,你有压力在模型中调用一个函数,我认为是这样。 然后模型一次又一次地建立,所以把它改成这样
onpressed:(){
call funtion;
pop;
}
我认为这可能对某些人有帮助