ConnectionState дважды изменяется в основном классе - PullRequest
1 голос
/ 09 мая 2020

У меня есть это приложение, где у меня есть вводный экран, который я хочу скрыть, если пользователь уже пропустил один раз. Я использую blo c с провайдером. Моя проблема в том, что состояние подключения меняется дважды, когда я перезапускаю приложение в горячем режиме, и я часами не понимал причины.

Вот мой код:

мой основной класс

void main() => runApp(StatsApp());

class StatsApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => IntroProvider(),
        )
      ],
      child: Consumer<IntroProvider>(builder: (context, value, child) {
        return MaterialApp(
            home: FutureBuilder(
          future: value.bloc.checkSkipped(),
          builder: (BuildContext context, snapshot) {
            print(snapshot.connectionState);
            print(snapshot.data);
            return SplashScreen();
          },
        ));
      }),
    );
  }
}

мой blo c

enum IntroEvents {
  ReadLocalStorage,
  SetIntroSkipped,
}

class IntroBloc extends Bloc<IntroEvents, bool> {
  PrefsManager _prefsManager = PrefsManager.instance;

  Future<bool> checkSkipped() async {
    this.add(IntroEvents.ReadLocalStorage);
    final skipped =
        await _prefsManager.getValue(PrefTypes.Bool, "skippedIntro");
    return skipped;
  }

  @override
  // TODO: implement initialState
  bool get initialState => false;

  @override
  Stream<bool> mapEventToState(IntroEvents event) async* {
    switch (event) {
      case IntroEvents.SetIntroSkipped:
        _prefsManager.setValue(PrefTypes.Bool, "skippedIntro", true);
        yield true;
        break;
      case IntroEvents.ReadLocalStorage:
        final skipped =
            await _prefsManager.getValue(PrefTypes.Bool, "skippedIntro");
        yield skipped;
        break;
      default:
        print("wtffffff");
    }
  }
}

мой провайдер

class IntroProvider with ChangeNotifier {
  IntroBloc _bloc;

  IntroProvider(){
    print("called IntroProvider");
    _bloc = IntroBloc();
  }

  IntroBloc get bloc => _bloc;
}

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 мая 2020

При работе со снимками вы можете проверить, есть ли файл snapshot.hasData. Обычно функции, которые вы хотите запустить, если в моментальном снимке есть данные, нужно заключать в оператор if, и предоставлять какое-то значение по умолчанию Widget, когда это не так.

FutureBuilder(
  future: value.bloc.checkSkipped(),
  builder: (BuildContext context, snapshot) {
    print(snapshot.connectionState);

    if (snapshot.hasData) {
      print(snapshot.data);
    }

    return SplashScreen();
  },
);
...