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】:
这里的代码将推送一个ProfileWidget
或UserWidget
的视图
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 找不到正确的提供者