#dart #flutter #state #scoped-model
#dart #flutter #состояние #модель с ограниченной областью
Вопрос:
когда я запускаю этот код, он показывает ошибку, что правильная scopedmodel не найдена. я думаю, мы должны объявить другую модель с ограниченной областью для bottomsheet, диалоги также сделали это, используя ту же модель, но она ведет себя ненормально. как мне этого добиться, как использовать модели с ограниченной областью действия в таких нижних листах и диалоговых окнах.
я был новичком в модели с ограниченной областью, любая помощь приветствуется
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:
В корне вашего приложения вам нужно запустить его с помощью. Это позволяет вам использовать виджеты ScopedModelDescendent, расположенные ниже в дереве.
ScopedModel<AppModel>(
model: AppModel(),
child: Resources())
Где бы вы ни отображали свои ресурсы, убедитесь, что они обернуты, как указано выше, тогда вы сможете использовать эту модель ниже в своем дереве.
Комментарии:
1. извините, что я отредактировал свой вопрос, у меня уже был он в верхней части дерева виджетов, также с той же ошибкой. на нижней странице отображается ошибка, в которой говорится, что не удалось найти правильную модель с ограниченной областью действия, попробуйте запустить этот код в редакторе ur, чтобы получить меня
2. @Saikumarreddy2391 Нет в ваших ресурсах корня, в котором отображается ваш виджет ресурсов. Где вы показываете виджет ресурсов? Что выводит ее на экран. Место, где вы выводите его на экран, должно быть окружено кодом, который у меня есть в моем ответе. Потомок, которого вы хотите сделать потомком, должен быть только потомком, он не должен предоставлять свою собственную модель. В этом весь смысл использования модели с ограниченной областью.
3. я использую панель вкладок, и весь приведенный выше код был второй вкладкой
4. Хорошо. Можете ли вы опубликовать код, который добавляет ресурсы на экран .
5. @Saikumarreddy2391 вы, кажется, не понимаете, о чем я спрашиваю, поэтому я не смогу вам помочь. Я надеюсь, вы разобрались с этим. И, если вы это поймете, я попробую еще раз. Место, куда вы добавляете свой виджет ресурсов, — это то, где вам нужно указать ScopedModel. НЕ внутри представления ресурсов. Это слишком далеко вниз по дереву. Место, куда вы помещаете свои ресурсы в дереве виджетов, — это то, где вы должны указать ScopedModel, А НЕ в вашем виджете ресурсов, это слишком далеко вниз по дереву.
Ответ №2:
Модель с ограниченной областью действия, когда переносится на страницу, тогда она применима только к этой странице. нижние листы и диалоги во flutter ничего, кроме создания нового контекста, т. Е. новой страницы, поэтому либо мы должны обернуть поверх приложения material, либо обернуть другую модель с ограниченной областью на нижнем листе с той же моделью. это должно сработать. и в вашем коде у вас есть это onpressed, вызывающее функцию в модели, я так думаю. затем модель строится снова и снова, поэтому измените ее следующим образом
onpressed:(){
call funtion;
pop;
}
я думаю, что это может быть полезно для некоторых, может быть