Flutter 错误:找不到正确的 ScopedModel

Posted

技术标签:

【中文标题】Flutter 错误:找不到正确的 ScopedModel【英文标题】:Flutter Error: Could not find the correct ScopedModel 【发布时间】:2019-01-27 05:20:05 【问题描述】:

我正在尝试在我的颤振项目中创建一个作用域模型,但我似乎无法弄清楚为什么会出现错误。这个 scopedmodel 实现有什么问题? 我有一个带有底部导航器的主页。在配置文件选项卡中,我在树深处的小部件中获取我需要的关注者列表,因此我尝试使用 scopedmodel。

型号代码为

class RelationshipsModel extends Model 
        List<Relationship> relations;
        RelationshipsModel(this.relations);
        void add(String name) 
            relations.add(new Relationship("", "", name, name));
            notifyListeners();
      
    

创建作用域模型的配置文件页面如下。在这里,我从 Firebase 获取状态中的关注者列表,并使用它为 scopedmodel 创建模型。

 class ProfileWidget extends StatefulWidget 
      @override
      _ProfileWidgetState createState() => _ProfileWidgetState();
    

class _ProfileWidgetState extends State<ProfileWidget> 
@override
  initState() 
    super.initState();
    getCurrentUserDetails();
  
getCurrentUserDetails() async 
_name = await CacheService.getCurrentUser();
var following = await service.getFollowingList(_name);
setState(() 
      this._following = following;
    );
  

 @override
  Widget build(BuildContext context) 
    if (this._name == null) 
      return new Container(
        child: const CupertinoActivityIndicator(),
      );
    

return  ScopedModel<RelationshipsModel>(
        model: RelationshipsModel(this._following),
        child: Scaffold(
       //more stuff

         background: new Stack(children: <Widget>[
                  new CarouselWidget(),
                  new Align(
                    alignment: FractionalOffset.topCenter,
                    heightFactor: 6.0,
                    child: new Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        //Here I am creating the a widget that shows the list of followers and following
                        new FollowerInfoWidget(followers: this._followers,
                            following: this._following),
                      ],
                    ),
                  ),
                ])),


     )
   );
  

FollowerInfoWidget 在下面,它根据列表中点击的用户调用 ProfileWidget 或 UserWidget

 class _FollowerState extends State<FollowerWidget> 

  Widget buildListTile(BuildContext context, Relationship item) 
    return new MergeSemantics(
      child: new ListTile(

        title: new Text(item.followerId),
        onTap: () async 
          if (item.followerId == await CacheService.getCurrentUser()) 
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => ProfileWidget()),
            );
          
          else 
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) =>
                  UserWidget(name: item.followerId)),
            );
          
        ,
        trailing: new Icon(Icons.info, color: Theme.of(context).disabledColor),
      ),
    );
  

FollowUnFollowWidget 按钮是 UserWidget 的一部分

    class UserWidget extends StatefulWidget 
  UserWidget(
      Key key)
      : super(key: key);
  @override
  _UserWidgetState createState() => _UserWidgetState();


class _UserWidgetState extends State<UserWidget> 
@override
  Widget build(BuildContext context) 
return Scaffold(
      body: DefaultTabController(
//more stuff
 new FollowerInfoWidget(
                              followers: this._followers,
                              following: this._following,
                            ),
                            new FollowUnFollowWidget ()

并且具有 ScopedModelDescendant 的小部件在下面

class FollowUnFollowWidget extends StatelessWidget   
  @override
  Widget build(BuildContext context) 
    return ScopedModelDescendant<RelationshipsModel>(
        builder: (context, child, model) =>
            FloatingActionButton(
            onPressed: () 
           //more stuff
       )
    );
  

【问题讨论】:

小部件树中的哪个位置是FollowUnFollowWidget?它在您的ProfileWidget 的 //more stuff 部分吗? 不,它是从另一个小部件调用的,而另一个小部件又是从 ProfileWidget 调用的。 ProfileWidget -> UserWidget -> FollowUnfollowWidget 你能用你提到的小部件的例子来展示更多吗? 所以 ProfileWidget 代表用户的个人资料,显示被关注的用户数量和关注者数量。这 2 个数字是可点击的文本,显示该列表中的所有用户。从该列表中选择用户时,将调用 UserWidget,它还有一个按钮来关注/取消关注该用户。我已经编辑了我最初的问题以添加更多代码 添加了答案,这可能是你的问题 【参考方案1】:

这里的代码将推送一个ProfileWidgetUserWidget 的视图

onTap: () async 
      if (item.followerId == await CacheService.getCurrentUser()) 
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => ProfileWidget()),
        );
      
      else 
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) =>
              UserWidget(name: item.followerId)),
        );
      
    ,

由于UserWidget 具有FollowUnFollowWidget,因此ScopedModelDescendant 的使用将不起作用,因为它上面没有ScopedModel。这个ScopedModel 只用ProfileWidget 定义

看起来您需要将ScopedModel 添加到UserWidget 的构建方法的顶部或作为buildListTile 的一部分

【讨论】:

【参考方案2】:

如果有人有同样的错误,错误也可能是上下文。 在某些情况下,它找不到 Scoped 模型,因为上下文不是您启动主 ScopedModel 的位置

【讨论】:

【参考方案3】:

您需要像这样在 main.dart 中添加 scopedmodel:

@override
  Widget build(BuildContext context)
    return ScopedModel<UserModel>(
        model: UserModel(),
        child: MaterialApp(
            title: "YourApp",
            debugShowCheckedModeBanner: false,
            home: Scaffold(
              body: HomeScreen(),
            )
        )
    );
  

【讨论】:

以上是关于Flutter 错误:找不到正确的 ScopedModel的主要内容,如果未能解决你的问题,请参考以下文章

找不到正确的提供者不一致的行为

错误:在此 Directioner 小部件上方找不到正确的 Provider<User>

Flutter cubit blocprovider 找不到正确的提供者

Flutter 致命错误:找不到“Flutter/Flutter.h”文件

颤振:找不到正确的提供者

Flutter - 从应用程序收到错误 -32601:找不到方法