【发布时间】:2020-04-21 21:28:52
【问题描述】:
我对提供程序和导航有疑问。
我有一个带有对象列表的HomeScreen。当您单击一个对象时,我会使用标签导航导航到 DetailScreen。这个DetailScreen 包裹着一个提供ViewModel 的ChangenotifierProvider
现在,当我使用 Navigator.of(context).push(EditScreen) 导航到另一个屏幕时,我无法访问 EditScreen 中的 ViewModel
抛出以下错误
════════ Exception caught by gesture ═══════════════════════════════════════════
The following ProviderNotFoundException was thrown while handling a gesture:
Error: Could not find the correct Provider<ViewModel> above this EditScreen Widget
这是我尝试实现的目标的简单概述
Home Screen
- Detail Screen (wrapped with ChangeNotifierProvider)
- Edit Screen
- access provider from here
我知道问题出在哪里。我正在堆栈上推送一个新屏幕,并且更改通知器不再可用。 我考虑在我的应用程序之上创建一个详细信息存储库,其中包含 DetailView 的所有 ViewModel。
我知道我可以将 ChangeNotifier 包裹在我的 MaterialApp 周围,但我不想这样做,或者因为我不知道我需要哪个 Detail-ViewModel 而不能这样做。我想要列表中每个项目的 ViewModel
我真的不知道解决这个问题的最佳方法是什么。谢谢大家的帮助
这是一个简单的示例应用程序:
This is a picture of the image tree
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text("DetailView"),
onPressed: () => Navigator.of(context).push(MaterialPageRoute(
builder: (context) => ChangeNotifierProvider(
create: (_) => ViewModel(), child: DetailScreen()))),
)));
}
}
class DetailScreen extends StatelessWidget {
const DetailScreen({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text("EditScreen"),
onPressed: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => EditScreen())),
),
));
}
}
class EditScreen extends StatelessWidget {
const EditScreen({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text("Print"),
onPressed: () =>
Provider.of<ViewModel>(context, listen: false).printNumber()),
),
);
}
}
class ViewModel extends ChangeNotifier {
printNumber() {
print(2);
}
}
【问题讨论】: