#firebase #flutter #google-cloud-firestore
#firebase #flutter #google-облако-firestore
Вопрос:
У новичка во flutter есть много вещей, которые только начинают разбираться, теперь это шаблон блоков, и теперь я столкнулся с проблемой, я не могу понять, как исправить эту ошибку, кажется, все правильно написал
Здесь общий интерфейс для всех блоков
abstract class BlocBase {
void dispose();
}
class BlocProvider<T extends BlocBase> extends StatefulWidget {
BlocProvider({
Key key,
@required this.child,
@required this.bloc,
}) : super(key: key);
final T bloc;
final Widget child;
@override
_BlocProviderState<T> createState() => _BlocProviderState<T>();
static T of<T extends BlocBase>(BuildContext context) {
final type = _typeOf<BlocProvider<T>>();
BlocProvider<T> provider = context.ancestorWidgetOfExactType(type);
return provider.bloc;
}
static Type _typeOf<T>() => T;
}
class _BlocProviderState<T> extends State<BlocProvider<BlocBase>> {
@override
void dispose() {
widget.bloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
Вот второй файл, в котором я использую BLoC и где он выдает ошибку
Здесь я использую функцию validateAndCreateData, с помощью которой я добавляю тикеты
@override
Widget build(BuildContext context) {
final bloc = BlocProvider.of<TicketsBloc>(context);
return Scaffold(
drawer: MyDrawer(),
appBar: AppBar(
title: Text('Sports'),
backgroundColor: Colors.blueGrey[900],
// automaticallyImplyLeading: false,
actions: <Widget>[
IconButton(
icon: Icon(Icons.share),
tooltip: 'Share',
onPressed: () {
Navigator.of(context).pushNamed('/second_screen');
}),
IconButton(
icon: Icon(Icons.account_circle),
tooltip: 'Your account',
onPressed: () {
Navigator.of(context)
.pushReplacementNamed('/account_screen');
}),
IconButton(
icon: Icon(Icons.add),
tooltip: 'Add Tickets',
onPressed: () => validateAndCreateData(bloc),
)
]),
body: MyTab(),
);
}
void validateAndCreateData(TicketsBloc bloc) async {
bloc.createData(description, image, name, price);
}
Ответ №1:
Ваша ошибка означает, что у вас нет доступа к блоку. Вы должны передать свое приложение поставщику. В противном случае вы не можете унаследовать это.
return BlocProvider(
child: MaterialApp(
title: 'My App',
home: HomeScreen(),
),
);