FutureProvider坏了吗? [英] Is FutureProvider broken or something?

查看:155
本文介绍了FutureProvider坏了吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I try this simple FutureProvider code yet it gave me an error:

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

我确保FutureProvider包装了我的MaterialApp,并使用Consumer窗口小部件获取了该提供程序.

I have make sure that FutureProvider wraps my MaterialApp and get the provider using Consumer widget.

这是我的代码:

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);
        }),
      ),
    );
  }
}

我在这里错过了什么吗?

Did I miss something here?

推荐答案

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

The error is quite descriptive of what is happening, you are trying to consume a String, and you don't have a provider of String.

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

If instead of FutureProvider(...etc you write FutureProvider<String>(...etc your IDE will point out that the catchError returns Void. This means that you return a String in create and Void in catchError, making the provider of type dynamic.

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

To solve this, make catchError return 'error', or anything that you choose, as long as it is a String.

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

编辑

正如第一个评论所指出的那样,您仍然会得到一个错误.由于FutureProvider没有initialValue,因此将其设置为null.这意味着,第一次运行会将空值传递给文本Widget.

Edit

As the first comment points out, you will still get an error. As the FutureProvider doesn't have an initialValue, it is set to null. This means that the very first run will pass a null value to the text Widget.

例如,可以通过将FutureProvider的initialValue设置为正在加载..."来防止这种情况.

This can be prevented by setting the initialValue of FutureProvider to 'loading...' for example.

这篇关于FutureProvider坏了吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆