我还是不太熟悉,我使用带有语言下拉菜单的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();。语言更改之后。但是仍然存在同样的问题。
任何建议将不胜感激。