Dart 使用带有子体和导航器的范围模型进行颤振/省道

Dart 使用带有子体和导航器的范围模型进行颤振/省道,dart,flutter,architecture,navigation,scoped-model,Dart,Flutter,Architecture,Navigation,Scoped Model,从昨天开始,我一直在努力解决这个问题——我正在选项卡控制器(ScreenTabs)中创建新的ScopedModel obj,然后通过将每个选项卡包装为ScopedModeleScendant,将其传递给BottomNavigationBar中的多个选项卡(第一级子体,例如:ScreenBook)。到目前为止一切都很好,一切正常 问题出现了,在我的一个选项卡中,我想导航到它的子级(第二级子级,例如:ScreenBookDetails)并在那里使用ScopedModel。我已经尝试过使用Scoped

从昨天开始,我一直在努力解决这个问题——我正在选项卡控制器(ScreenTabs)中创建新的ScopedModel obj,然后通过将每个选项卡包装为ScopedModeleScendant,将其传递给BottomNavigationBar中的多个选项卡(第一级子体,例如:ScreenBook)。到目前为止一切都很好,一切正常

问题出现了,在我的一个选项卡中,我想导航到它的子级(第二级子级,例如:ScreenBookDetails)并在那里使用ScopedModel。我已经尝试过使用ScopedModelScenedant和ScopedModel.of(上下文),但没有遇到运气错误:每次都找不到正确的ScopedModel

我的代码(为了简洁起见跳过了一些):

选项卡控制器
。。。
类ScreenTabsState扩展状态{
ModelTabs ModelTabs=ModelTabs();//新模型对象
变量屏幕=[new ScreenHome(),new ScreenBook(),];
@凌驾
小部件构建(构建上下文){
返回范围模型(
型号:型号选项卡,
儿童:脚手架(…)
body:Builder(Builder:(context)=>容器(子:
screens.elementAt(selectedIndex),),
底部导航栏:底部导航栏(
currentIndex:selectedIndex,
项目:[……],
onTap:onTabTapped,
),)...}
屏幕手册(第一个ddescendant-ScpodedModel按预期工作)
。。。
类ScreenBookState扩展状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:ScopedModelSecondant(生成器:(上下文、子对象、模型){
打印(标记+“模型状态:”+model.status.toString());
return model.status==status.LOADING?MyCircularProgressIndicator():
生成器(生成器:(上下文)=>
卡片(。。。
孩子:InkWell(
onTap:(){
Navigator.of(context.pushNamed(“/ScreenBookDetails”);},)}
ScreenBookDetails(第1个ddescendant-错误)
。。。
类ScreenBookDetailsState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:ScopedModelSecondant(生成器:(上下文、子对象、模型){
打印(标记+“作用域模型状态:”+model.status.toString());//错误:找不到正确的作用域模型。
return model.status==status.LOADING?MyCircularProgressIndicator():生成器(生成器:(上下文)=>列(…)
...
有人能告诉我解决这个问题的正确方法吗?我对飞镖和颤振还不熟悉,所以当我在ScreenSsplashScreen中创建ScopedModel obj,然后导航到ScreenLogIn并尝试在那里使用它时,可能有一些我不太清楚的问题


谢谢!:)

在ScopedModel的Github支持的帮助下,终于找到了如何处理ScopedModel包括Navigator的方法-关键是在构建(BuildContext)之外创建一个ScopeModel实例,然后通过下一屏幕的构造函数传递该实例,如:

class HomePage extends StatelessWidget {
 SampleScopedModel model = SampleScopedModel();
 @override
  Widget build(BuildContext context) {
    return ScopedModel<SampleScopedModel>(
      model: model,
      child: Scaffold(
        body: Container(),
        floatingActionButton: FloatingActionButton(onPressed: () {
          Navigator.push(context, 
           MaterialPageRoute(builder: (context) => NextPage(model))
          );
        }),
      ),
    );
  }
}

class NextPage extends StatelessWidget {
  final SampleScopedModel model;
  NextPage(this.model);
  @override
    Widget build(BuildContext context) {
      return ScopedModel<SampleScopedModel>(
        model: model,
        child: Scaffold(
          body: ScopedModelDescendant<SampleScopedModel>(
          builder: (context, child, model) {
            return Text(model.payload.toString());
          })
        ),
     );
    }
}
类主页扩展了无状态小部件{
SampleScopedModel模型=SampleScopedModel();
@凌驾
小部件构建(构建上下文){
返回范围模型(
模型:模型,
孩子:脚手架(
主体:容器(),
浮动操作按钮:浮动操作按钮(按下时:(){
Navigator.push(上下文,
MaterialPage路线(生成器:(上下文)=>下一页(模型))
);
}),
),
);
}
}
类NextPage扩展了无状态小部件{
最终样本镜模型;
下一页(此.model);
@凌驾
小部件构建(构建上下文){
返回范围模型(
模型:模型,
孩子:脚手架(
正文:ScopedModelSchendant(
生成器:(上下文、子对象、模型){
返回文本(model.payload.toString());
})
),
);
}
}

我可以确认,您不需要传递模型本身。您只需要在根页面上定义一次,然后就可以在应用程序中的任何位置将其称为ScopedModelSecondant
...
class ScreenBookState extends State<ScreenBook> {

@override
Widget build(BuildContext context) {
return new Scaffold(
body: ScopedModelDescendant<ModelTabs>(builder: (context, child, model) {
print(TAG + "model status:" +  model.status.toString());
return model.status == Status.LOADING ? MyCircularProgressIndicator() :         
Builder (builder: (context) => 
Card(...
child: InkWell(
onTap: (){
Navigator.of(context).pushNamed("/ScreenBookDetails");},))}}
...
class ScreenBookDetailsState extends State<ScreenBookDetails>{

@override
Widget build(BuildContext context) {
return Scaffold(
body: ScopedModelDescendant<ModelTabs>(builder: (context, child, model) {
print(TAG + "scoped model status: " + model.status.toString()); //Error: Could not find the correct ScopedModel.
return model.status == Status.LOADING ? MyCircularProgressIndicator() :     Builder(builder: (context) => Column(...)
...
class HomePage extends StatelessWidget {
 SampleScopedModel model = SampleScopedModel();
 @override
  Widget build(BuildContext context) {
    return ScopedModel<SampleScopedModel>(
      model: model,
      child: Scaffold(
        body: Container(),
        floatingActionButton: FloatingActionButton(onPressed: () {
          Navigator.push(context, 
           MaterialPageRoute(builder: (context) => NextPage(model))
          );
        }),
      ),
    );
  }
}

class NextPage extends StatelessWidget {
  final SampleScopedModel model;
  NextPage(this.model);
  @override
    Widget build(BuildContext context) {
      return ScopedModel<SampleScopedModel>(
        model: model,
        child: Scaffold(
          body: ScopedModelDescendant<SampleScopedModel>(
          builder: (context, child, model) {
            return Text(model.payload.toString());
          })
        ),
     );
    }
}