FutureProvider损坏了吗?

时间:2020-04-13 20:30:02

标签: flutter flutter-provider

我尝试了这个简单的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);
        }),
      ),
    );
  }
}

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

该错误非常说明正在发生的事情,您正在尝试使用String,并且没有String的提供程序。

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

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

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

编辑

第一条评论指出,您仍然会收到错误消息。由于FutureProvider没有initialValue,因此将其设置为null。这意味着第一次运行会将空值传递给文本Widget。

例如,可以通过将FutureProvider的initialValue设置为“ loading ...”来防止这种情况。