Я столкнулся с проблемой добавления событий в объект Blo c после того, как ранее столкнулся с ответом HTTP 404 с библиотекой Dio.
Я создал простой пример, чтобы показать проблему. Это позволяет пользователю нажимать кнопку. Когда это происходит, событие генерируется и добавляется в объект blo c. Blo c пытается вызвать некоторый URL, который не существует, получая ошибку HTTP 404. Теперь DioError правильно перехватывается с помощью try-catch, на экране отображается сообщение об ошибке, однако при запуске в Интернете, когда я пытаюсь выполнить тот же поток снова, объект blo c не получает это событие (вызов BlocProvider.of (context) .add (Event ()) оказывает влияние), метод mapEventToState больше никогда не вызывается для объекта MyBlo c, и нет ошибки (кроме неудачного HTTP-запроса, отображаемого в консоли браузера)
Примечание: отлично работает на Android и iOS, но не на веб
Мои зависимости (от pubspe c .yaml)
bloc: 4.0.0
flutter_bloc: 4.0.0
dio: 3.0.9
Код:
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:bloc/bloc.dart';
import 'package:dio/dio.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dio web error',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: BlocProvider(
create: (context) => MyBloc(),
child: MyHomePage(),
));
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Dio web error"),
),
body: BlocBuilder<MyBloc, MyState>(
bloc: BlocProvider.of<MyBloc>(context),
builder: (context, state) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
state.status,
style: Theme.of(context).textTheme.headline4,
),
FlatButton(
onPressed: () =>
BlocProvider.of<MyBloc>(context).add(Event()), // <-- THIS DOESN'T WORK 2ND TIME
child: Text("start"),
),
],
));
}));
}
}
class MyBloc extends Bloc<Event, MyState> {
@override
MyState get initialState => MyState("begin");
@override
Stream<MyState> mapEventToState(Event event) async* {
print("handle event");
try {
yield MyState("loading...");
Dio dio = Dio();
var result = await dio.get("http://does.not.exist/");
print(result);
yield MyState("ok");
} on DioError catch (e) {
print(e);
yield MyState("error"); // <-- Error is properly caught and state is generated
}
}
}
class Event {}
class MyState {
final String status;
MyState(this.status);
}
Моя версия флаттера: Channel beta, v1.17.0-3.2.pre Android studio 3.6.3
РЕДАКТИРОВАТЬ: я обнаружил, что это работает нормально при запуске "flutter build web" "и обслуживать контент с помощью sth, например python SimpleHTTPServer.
Я могу воспроизвести проблему только при запуске на chrome из android studio