窗口小部件未根据区域设置语言的更改更新方向-FLUTTER

时间:2019-05-02 11:00:33

标签: flutter flutter-layout

我还是不太熟悉,我使用带有语言下拉菜单的Bloc模式开发了登录屏幕。我使用Scoped_model进行小部件重建。当我选择一种语言时,所有应用程序都会更新为新语言,但是小部件不会根据所选语言来更新路线。例如阿拉伯语应为RTL,但仍显示为LTR。这就是我所做的,

class AppModel extends Model{
  void rebuildWidgets (){
    notifyListeners();
  }
}


class GlobalTranslations{
  static Locale _locale;
  static Map<dynamic, dynamic> _localizedValues;
 ......
  get currentLanguage => _locale == null ? '' : _locale.languageCode;

  /// Returns the current Locale
 static get locale => _locale;
 Future<Null> setNewLanguage([String newLanguage]) async {
    String language = newLanguage;
    if (language == null){
      language = await preferences.getPrefferedLanguage();
    }

    // Set the locale
   if (language == ""){
     // language = "en";
     language = _defaultLanguage;
    }

    String country_code=   getCountryCode (language);
    _locale = Locale(language, country_code);


    // Load the language strings
    String jsonContent = await 
    rootBundle.loadString("locale/XXXXX_${_locale.languageCode}.json");
    _localizedValues = json.decode(jsonContent);

    //Clear the cache
    _cache = {};

    // If there is a callback to invoke to notify that a language has changed
    if (_onLocaleChangedCallback != null){
      _onLocaleChangedCallback();
    }
  return null;
  }
}


void main() async {
 runApp(ScopeModelWrapper());
}


class ScopeModelWrapper extends StatelessWidget{

  final AppModel model;

  const ScopeModelWrapper ({Key key, @required this.model}): super(key: key);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ScopedModel<AppModel>(model: AppModel(), child: App());
  }

}





class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  TranslationsBloc translationsBloc;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    translationsBloc = TranslationsBloc();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    translationsBloc?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider<TranslationsBloc>(
      bloc: translationsBloc,
      child: StreamBuilder<String>(
        stream: translationsBloc.currentLanguage,
        builder: (BuildContext context, AsyncSnapshot<String> snapshot)
    {


      return ScopedModelDescendant<AppModel>(builder: (context, child, model) {

        return MaterialApp(
          debugShowCheckedModeBanner: false,
          localizationsDelegates: [
            const GlobalTranslationsDelegate(),
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],



          supportedLocales: [
            Locale("en", "AU"),
            Locale("ar", "AE"),
.......
          ],

          home: new LoginPage(),
          );

        });
       },
      ),
    );
  }
}

然后我用模型和onSelect方法包装我的语言下拉窗口小部件,我先调用changeLanguage方法,然后再从模型中重建窗口小部件方法。

注意:仅出于测试目的,我使用Model扩展了GlobalTransaction类,并称为notifyListeners();。语言更改之后。但是仍然存在同样的问题。

任何建议将不胜感激。

0 个答案:

没有答案