Flutter FutureProvider не найден при попытке использовать его содержимое в ListView - PullRequest
0 голосов
/ 14 февраля 2020

ребята, новичок Флаттер здесь. Я читаю json в приложении, которое начинается с FutureProvider, но когда я пытаюсь использовать его для загрузки ListView, я получаю сообщение «Не удалось найти правильный поставщик выше этого потребителя», но оно объявлено и загружено выше MaterialApp. Я пытался использовать Consumer и Provider.of, но ни один не работает. Подробно: я хочу поделиться содержимым json между всеми страницами в маршрутах.

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => Selecao()),
        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),
          lazy: false,
        )
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: HomePage(), // route for home is '/' implicitly
        routes: <String, WidgetBuilder>{
          // define the routes
          ApresentacaoPage.routeName: (BuildContext context) =>
              ApresentacaoPage(),
          CatecismosPage.routeName: (BuildContext context) => CatecismosPage(),
          DocumentosPage.routeName: (BuildContext context) => DocumentosPage(),
          IndicePage.routeName: (BuildContext context) => IndicePage(),
          SobrePage.routeName: (BuildContext context) => SobrePage(),
          PesquisaPage.routeName: (BuildContext context) => PesquisaPage(),
          ConteudoPage.routeName: (BuildContext context) => ConteudoPage(),
        },
      ),
    );
  }
}

Мой FutureProvider:

class DocumentoProvider with ChangeNotifier {
  final String _dataPath = "assets/data.json";
  List lista = new List();

  Future<List> loadDocumentoData() async {
    var dataString = await loadAsset();
    lista = json.decode(dataString);

    print('leu provider');
    // print(lista);
    // notifyListeners();
    return lista;
  }

  Future<String> loadAsset() async {
    return await rootBundle.loadString(_dataPath);
  }
}

И HomePage пытается загрузить свойство lista из мой поставщик будущего:

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    // var documentos = Provider.of<DocumentoProvider>(context, listen: false);
    // var lista = documentos.lista;
    // print(lista);

    return Scaffold(
      appBar: AppBar(
        title: Text("CONFE"),
      ),
      drawer: Menu(),
      body: Container(
        child: Center(
          child: Consumer<DocumentoProvider>(
            builder: (context, documentos, child) => ListView.builder(
              key: ObjectKey(documentos.lista[0]),
              itemBuilder: (BuildContext context, int index) {
                return Card(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      titleSection(documentos.lista[index]),
                    ],
                  ),
                );
              },
              itemCount: documentos.lista == null ? 0 : documentos.lista.length,
            ),
          ),
        ),
      ),
    );
  }

Я только что прочитал и посмотрел множество учебных пособий, но не могу это исправить.

1 Ответ

0 голосов
/ 23 апреля 2020

Я думаю, что ваш Consumer<DocumentoProvider> внутри HomePageState ищет неправильный тип объекта.

Ваши провайдеры в MyApp предоставляют два типа:

  • Selecao
  • List
        ChangeNotifierProvider(create: (context) => Selecao()),
        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),
          lazy: false,
        )

Но в HomePageState вы пытаетесь потребить DocumentoProvider

 body: Container(
        child: Center(
          child: Consumer<DocumentoProvider>(

Я думаю, что это должно быть :

 body: Container(
        child: Center(
          child: Consumer<List>(

Не связано примечание - я не думаю, что вам нужно async здесь:

        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),

Поскольку loadDocumentData() определяется как асинхронная c функция внутри DocumentoProvider

...