Flutter web - Blo c не получает события после ошибки Dio 404 - PullRequest
0 голосов
/ 23 апреля 2020

Я столкнулся с проблемой добавления событий в объект 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

...