Не удалось найти правильного поставщика над этим виджетом Builder.Android

Форум для тех, кто программирует под Android
Anonymous
Не удалось найти правильного поставщика над этим виджетом Builder.

Сообщение Anonymous »

Я новичок в Flutter и Bloc.
Я создал фиктивное приложение для составления бюджета, состоящее из двух представлений списков; доходы и расходы, в которых соответствующие списки будут заполняться в зависимости от того, что сэкономит пользователь (например, нажатие на кнопку отобразит форму, в которой он выберет, вводит ли это доход или расход, и сумму после сохранения, соответствующий список будет заполнен.)
Я просмотрел видеоурок о том, как создать путь адаптации в приложении.
Проблема, с которой я столкнулся сейчас, заключается в том, что пользователь сохраняет свои доходы/расходы, нажимая кнопку «Сохранить» в форме, и я получаю следующую ошибку:

Код: Выделить всё

The following ProviderNotFoundException was thrown while handling a gesture:
Error: Could not find the correct Provider above this Builder Widget

This happens because you used a `BuildContext` that does not include the provider
of your choice. There are a few common scenarios:

- You added a new provider in your `main.dart` and performed a hot-reload.
To fix, perform a hot-restart.

- The provider you are trying to read is in a different route.

Providers are "scoped". So if you insert of provider inside a route, then
other routes will not be able to access that provider.

- You used a `BuildContext` that is an ancestor of the provider you are trying to read.

Make sure that Builder is under your MultiProvider/Provider.
This usually happens when you are creating a provider and trying to read it immediately.
Несколько замечаний:

- Чтобы отобразить экран адаптации, мне пришлось изменить способ работы моего приложения, раньше это было так:

Код: Выделить всё

    void main() {
Bloc.observer = const GlobalApplicationObserver();
runApp(MyApp());
}
но теперь это:

Код: Выделить всё

    void main() {
Bloc.observer = const GlobalApplicationObserver();
runApp(MaterialApp(home: OnboardingPageWidget()));
}
по сути является DefaultTabController с 1 вкладкой на данный момент, а страница, отображаемая на вкладке, представляет собой экран с двумя списками. В методе сборки этого класса возвращается BlocProvider, а в методе сборки — страница контроллера вкладок/
Это мой класс адаптации:

Код: Выделить всё

import 'package:budgetapplication/main.dart';
import 'package:budgetapplication/repository/expenditure_repository.dart';
import 'package:flutter/material.dart';

//This is a private class
class _OnboardingPageState extends State {
final PageController controller = PageController();
bool isLastPage = false;

@override
void dispose() {
controller.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
padding: EdgeInsets.only(bottom: 80),
child: PageView(
controller: controller,
onPageChanged: (index) {
setState(() {
isLastPage = index == 1;
});
},
children: [
Container(
color: Colors.amber,
child: Center(
child: Text('Page 1'),
),
),
Container(
color: Colors.red,
child: Center(
child: Text('Page 2'),
),
)
],
),
),
bottomSheet: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
child: Row(
children: [
isLastPage
? TextButton(
child: Text('Finish!'),
onPressed: () async {
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => MyApp()));
},
)
: TextButton(
child: Text('Next'),
onPressed: () {
controller.nextPage(
duration: Duration(milliseconds: 500),
curve: Curves.bounceInOut);
},
)
],
),
));
}
}

class OnboardingPageWidget extends StatefulWidget {
@override
State createState() => _OnboardingPageState();
}
Я подозреваю, что из-за маршрутизации контекст теряется? Не уверен, но любая помощь будет принята с благодарностью!

Подробнее здесь: https://stackoverflow.com/questions/790 ... der-widget

Вернуться в «Android»