- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Flutter 中开发一个应用程序(我还是个新手),但遇到以下错误:
Error: Could not find the correct Provider<List<Category>> above this Exercises Widget
This likely happens because you used a `BuildContext` that does not include the provider
of your choice. There are a few common scenarios:
- The provider you are trying to read is in a different route.
Providers are "scoped". So if you insert of provider inside a route, then
other routes will not be able to access that provider.
- You used a `BuildContext` that is an ancestor of the provider you are trying to read.
Make sure that Exercises is under your MultiProvider/Provider<List<Category>>.
This usually happen when you are creating a provider and trying to read it immediately.
For example, instead of:
```
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// Will throw a ProviderNotFoundError, because `context` is associated
// to the widget that is the parent of `Provider<Example>`
child: Text(context.watch<Example>()),
),
}
```
consider using `builder` like so:
```
Widget build(BuildContext context) {
return Provider<Example>(
create: (_) => Example(),
// we use `builder` to obtain a new `BuildContext` that has access to the provider
builder: (context) {
// No longer throws
return Text(context.watch<Example>()),
}
),
我一直在网上查看,这显然与我在 execution_add.dart 中调用 Provider.of
Widget build(BuildContext context) {
return _isLoading
? Loading()
: MultiProvider(
providers: [
StreamProvider<List<Exercise>>(
create: (context) => DatabaseService().exercises,
),
StreamProvider<List<Category>>(
create: (context) => DatabaseService().categories,
),
ChangeNotifierProvider<ExerciseFilter>(
create: (context) => ExerciseFilter(isActive: true),
)
],
child: Scaffold(
appBar: AppBar(
title: Text('Exercises'),
elevation: 0.0,
actions: _buildActions(),
),
body: ExerciseList(),
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.black,
child: Icon(Icons.add, color: Colors.white),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ExercisesAdd(),
),
);
},
),
),
);
}
}
练习_add.dart
@override
Widget build(BuildContext context) {
final cats = Provider.of<List<Category>>(context);
print(cats.length);
return Scaffold(
appBar: AppBar(
title: Text('Add Exercise'),
elevation: 0.0,
),
body: SingleChildScrollView(
child: Container(
padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 50.0),
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
SizedBox(height: 20.0),
TextFormField(
decoration:
textInputDecoration.copyWith(hintText: 'Exercise Name'),
validator: (value) {
if (value.isEmpty) {
return 'Exercise name is required';
}
return null;
},
onChanged: (value) {
setState(() {
exerciseName = value;
});
},
),
SizedBox(height: 20.0),
Theme(
data: Theme.of(context).copyWith(canvasColor: Colors.white),
child: DropdownButtonFormField<String>(
decoration: dropdownDecoration,
value: exerciseCategory,
onChanged: (value) {
setState(() {
exerciseCategory = value;
});
},
items: categories.map<DropdownMenuItem<String>>((value) {
return DropdownMenuItem<String>(
value: value.name,
child: Text(value.name),
);
}).toList(),
),
),
SizedBox(height: 20.0),
RaisedButton(
elevation: 0,
color: Colors.black,
child: Text(
'Add Exercise',
style: TextStyle(color: Colors.white),
),
onPressed: () async {
if (_formKey.currentState.validate()) {
bool failed = false;
String uid = await _auth.getCurrentUser();
if (uid != null) {
dynamic result = DatabaseService(uid: uid)
.addExercise(exerciseName, exerciseCategory);
if (result != null) {
Navigator.pop(context);
} else {
failed = true;
}
} else {
failed = true;
}
if (failed) {
setState(() {
error = 'Failed to add exercise. Please try again';
});
}
}
},
),
SizedBox(height: 12.0),
Text(
error,
style: TextStyle(color: Colors.red, fontSize: 14.0),
),
],
),
),
),
),
);
数据库服务().练习
List<Category> _categoryListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return Category(name: doc.data['category'] ?? '');
}).toList();
}
Stream<List<Category>> get categories {
return categoryCollection
.orderBy('category')
.snapshots()
.map(_categoryListFromSnapshot);
}
注意:StreamProvider 和 MultiProvider 等都是 'provider' 包的一部分(我使用最新版本)
最佳答案
您收到的错误描述了您当前所处的场景。
- The provider you are trying to read is in a different route.
Providers are "scoped". So if you insert of provider inside a route,then other routes will not be able to access that provider.
MultiProvider
在您在小部件树中使用的任何导航器上方。您可能正在使用
MaterialApp
为此,请移步
MultiProvider
并制作
MaterialApp
它是
child
.
关于Flutter StreamProvider 使用了一个 `BuildContext`,它是提供者的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63315716/
我正在使用 Google Cloud Firestore 作为 Flutter 应用程序的后端。目前我正在使用 StreamProvider 从云 firestore 构建数据流。现在,我需要维护 2
我正在尝试使用 StreamProvider(来自 this awesome package),但我一直在努力让特定的流工作。 我创建了一个 StreamController,我用它通过它的 Sink
我从 StreamProvider 获取的数据不完整。 下一个最小的小部件树重现了我的问题:选项卡式屏幕上的 SreamProvider。 我的用户对象包含多个值(以及其他属性)的映射,我通过调用 f
目前,我们正在使用 Firebase 在我们的应用程序上实现简单的聊天。 我们使用 Riverpod 处理应用程序的启动和身份验证。 启动过程如下: @override Widget build(
我想知道是否有人可以告诉我如何实现 Flutter StreamProvider“catchError”属性? 下面的示例代码添加到: StreamProvider.value( initia
我是 flutter 的新手。我实现了这个示例应用程序以了解 SQLite 和提供程序状态管理。这是一个简单的任务管理系统。我使用 MOOR 来处理 SQLite 数据库。我遇到的问题是任务列表在添加
我使用 StreamProvider将图像提供给其他应用程序。一切正常,但有一种情况除外:当我尝试将多张图像共享到我的三星 S6 设备(Android 5.1.1)上的消息传递应用程序时,消息传递应用
StreamProvider.value 使用相同的值多次构建小部件。 StreamProvider.value( value: FirebaseAuth.instance.onAuthS
我有一个像这样的 StreamBuilder: StreamBuilder>( stream: myDatabase.authInfosDao.watch(),
我正在 Flutter 中开发一个应用程序(我还是个新手),但遇到以下错误: Error: Could not find the correct Provider> above this Exerci
我有两个流: Stream FirebaseAuth.instance.onAuthStateChanged Stream userService.streamUser(String uid) 我的
当我尝试在 firestore 中获取不存在的数据时,我遇到了 StreamProvider 的问题。 Stream streamCollectedItem(String id,int categor
我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示: class MyApp extends StatelessWidget
我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示: class MyApp extends StatelessWidget
我正在使用 Flutter 开发一个应用程序,我正在使用 Cloud Firestore。是否有任何理由更喜欢 StreamBuilder 之间的一个和 StreamProvider ? 最佳答案 有
我正在尝试设置一个个人资料类型页面,用户可以在其中查看他们的信息,最终我将添加功能,以便他们可以更改他们的数据。我正在使用 Provider 访问 Firebase 流 它返回当前用户的 UID(这工
我试图通过将简单的 FireStore auth Provider 示例迁移到 RiverPod 来了解 RiverPod。 这是我的身份验证服务: import 'package:firebase_
有时我想我得到了提供者的逻辑,然后我被难住了几个小时试图做下面的事情。 我需要从 Firestore 集合流中获取连接 ID 列表。简单。 但是,我需要将此连接 ID 的流列表提供给另一个 fires
我注意到自从我使用 StreamProvider 添加一个新的 Stream 以来,我的读取请求显着增加。 ,我设法通过删除流和没有重复请求来确认这一点。但我似乎无法追查为什么它重复。 注意:代码运行
我正在尝试根据 Firebase 的身份验证状态创建一个简单的导航,但出于某种原因Provider.of(context)始终返回 null 作为小部件构建方法中的第一个值。所以我的应用程序总是导航到
我是一名优秀的程序员,十分优秀!