Библиотека scoped_model
предназначена для одновременной работы с несколькими играющими моделями. Это одна из причин того, что ScopedModel
и ScopedModelDescendant
являются обобщенными и имеют параметр типа. Вы можете определить несколько моделей в верхней части дерева виджетов, используя ScopedModel<LoginModel>
и ScopedModel<NewsModel>
, а затем использовать эти модели ниже в дереве, используя ScopedModelDescendant<LoginModel>
и ScopedModelDescendant<NewsModel>
. Потомки будут искать подходящую модель на основе параметра типа.
Я собрал быстрый пример. Вот модели:
class ModelA extends Model {
int count = 1;
void inc() {
count++;
notifyListeners();
}
}
class ModelB extends Model {
int count = 1;
void inc() {
count++;
notifyListeners();
}
}
И вот что я показываю в приложении:
ScopedModel<ModelA>(
model: ModelA(),
child: ScopedModel<ModelB>(
model: ModelB(),
child: ScopedModelDescendant<ModelA>(
builder: (_, __, a) => ScopedModelDescendant<ModelB>(
builder: (_, __, b) {
return Center(
child: Column(
children: [
GestureDetector(
onTap: () => a.inc(),
child: Text(a.count.toString()),
),
SizedBox(height:100.0),
GestureDetector(
onTap: () => b.inc(),
child: Text(b.count.toString()),
),
],
),
);
},
),
),
),
)
Кажется, все работает нормально. Не вложенный подход также работает:
ScopedModel<ModelA>(
model: ModelA(),
child: ScopedModel<ModelB>(
model: ModelB(),
child: Column(
children: [
ScopedModelDescendant<ModelA>(
builder: (_, __, model) => GestureDetector(
onTap: () => model.inc(),
child: Text(model.count.toString()),
),
),
SizedBox(height: 100.0),
ScopedModelDescendant<ModelB>(
builder: (_, __, model) => GestureDetector(
onTap: () => model.inc(),
child: Text(model.count.toString()),
),
),
],
),
),
)