Проблемы с отображением закусочной в новой выбранной языковой локали? - PullRequest
0 голосов
/ 10 января 2020

У меня есть экран, который меняет язык при нажатии на соответствующее поле языка, а затем устанавливает новый язык с помощью поставщика blo c! Эта языковая локаль передается в файл main.dart в переменную локаль, с помощью которой приложение решает, из какого файла json загрузить язык. Я столкнулся с проблемой в виде закусочной / текста тоста. Когда пользователь нажимает на кнопку, появляется модальное всплывающее окно подтверждения, после чего экран переходит к предыдущему экрану, на котором отображается снэк-бар с текстом измененного языка, хотя в моем сценарии снэк-бар не отображает текст выбранного языка, а показывает ранее выбранный язык текста. Может кто-нибудь помочь с этим?

файл app.dart

return MaterialApp(
  builder: (context, widget) => LoadingContainer(
    key: const ValueKey('LoadingContainer'), 
    child: widget
  ),
  localizationsDelegates: [
    const SLocalizationsDelegate(),
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ],
  supportedLocales: const [
    Locale('en'),
    Locale('id'),
  ],
  onGenerateRoute: CustomRoute.switcher,
  locale: state.locale,
  title: 'Test App',
  theme: appTheme(context),
  initialRoute: RouteList.initial,
  routes: Routes.getAll(),
);

Это вызов API, и после успешного завершения вызовет еще один блок c укажите, какой набор состояния отвечает за загрузку новой локали для всего приложения.

Stream<ChangeLanguageState> _mapUpdateProfileToState(
  UpdateLanguageThroughAPIEvent event
) async* {
  loaderBloc.add(StartLoading());

  try {
    final updatedCustomerDetails = await customerUsecase.patchCustomerDetails(
      event.customerId,
      {'languagePreferred': event.locale},
    );

    languageBloc.add(
      SetLanguageToSharedPreferenceEvent(event.updatedLanguage.locale)
    );

    yield LoadedUpdateLanguageAPIState(
      customerDetails: updatedCustomerDetails,
      languageList:
        _getUpdatedLanguages(
          state.languageList, 
          event.updatedLanguage,
        ),
    );
  } catch (_) {
    yield ErroredChangeLanguageState(
      languageList: event.languageList,
    );
  } finally {
    loaderBloc.add(FinishLoading());
  }
}

Этот набор задает локальное хранилище, а также обновляет состояние, через которое приложение знает, какой файл json загружать

Stream<LanguageState> _mapUpdateLocaleToState(
  SetLanguageToSharedPreferenceEvent event
) async* {
  yield LoadingLocaleState();

  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('lang', event.locale.toString());

  yield LoadedLocaleState(event.locale);
}

Проблема здесь

if (state is LoadedUpdateLanguageAPIState 
  && languageState is LoadedLocaleState
) {
  Navigator.pop(context);

  final String translatedText = S.of(context).translate(
    'changeLanguage.snackBar.success'
  );
  Navigator.of(context).pop(translatedText);
}

после первого появления навигатора в переведенном тексте должен быть загружен текст с последнего выбранного языка, но он берет с ранее выбранного языка

...