FutureProvider сломан или что-то? - PullRequest
0 голосов
/ 13 апреля 2020

Я пробую этот простой код 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 Ответ

1 голос
/ 14 апреля 2020

Ошибка довольно точно описывает происходящее, вы пытаетесь потреблять String, и у вас нет поставщика String.

Если вместо FutureProvider(...etc вы пишете FutureProvider<String>(...etc ваша IDE укажет, что catchError возвращает Void . Это означает, что вы возвращаете String в create и Void в catchError, делая провайдера типа dynamici c.

Чтобы решить эту проблему, заставьте catchError вернуть 'error' или что-либо, что вы выберете, при условии, что это строка.

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

Редактировать

В качестве первого комментария , вы все равно получите ошибку. Поскольку у FutureProvider нет initialValue, для него установлено значение null. Это означает, что самый первый запуск передаст нулевое значение текстовому виджету.

Этого можно избежать, установив initialValue для FutureProvider в значение «loading ...», например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...