Is FutureProvider broken or something?



我尝试了这个简单的FutureProvider代码,但它给了我一个错误:

Error: Could not find the correct Provider<String> above this Consumer<String> Widge

我已经确保FutureProvider包装了我的MaterialApp,并让提供商使用Consumer小部件。

这是我的代码:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureProvider(
create: (_) => Future.value('test'),
catchError: (_, error) => print(error),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.amber,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Home(),
),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Consumer<String>(builder: (context, string, _) {
return Text(string);
}),
),
);
}
}

我错过什么了吗?

这个错误很好地描述了正在发生的事情,您正试图使用String,而您没有String的提供者。

如果您编写的不是FutureProvider(...etc而是FutureProvider<String>(...etc,则IDE将指出catchError返回Void。这意味着您在create中返回一个String,在catchError中返回Void从而使类型为的提供程序动态

要解决此问题,请使catchError返回"error",或您选择的任何内容,只要它是字符串即可。

catchError: (_, error) { 
print(error);
return 'error';
},

编辑

正如第一条评论所指出的,你仍然会得到一个错误。由于FutureProvider没有initialValue,因此它被设置为null。这意味着第一次运行将向文本Widget传递一个null值。

这可以通过将FutureProvider的initialValue设置为"正在加载…"来防止例如

最新更新