在我的应用程序的设置页面中,我想添加一个控制应用程序语言的选项。
我可以在启动应用之前像这样设置语言:
@override
Widget build(BuildContext context) {
return MaterialApp(
// other arguments
locale: Locale('ar'),
);
}
但是可以在不重新启动应用程序的情况下更改语言吗?
答案 0 :(得分:1)
将您的MaterialApp
包裹到StreamBuilder
中,这将负责为您的应用程序提供Locale
值。而且它将使您能够动态更改它,而无需重新启动应用程序。我使用rxdart package来实现流:
@override
Widget build(BuildContext context) {
return StreamBuider(
stream: setLocale,
initialData: Locale('ar',''),
builder(context, localeSnapshot){
return MaterialApp(
// other arguments
locale: localeSnapshot.data,
);
}
);
}
Stream<Locale> setLocale(int choice) {
var localeSubject = BehaviorSubject<Locale>() ;
choice == 0 ? localeSubject.sink.add( Locale('ar','') ) : localeSubject.sink.add( Locale('en','') ) ;
return localeSubject.stream.distinct() ;
}
以上演示只是实现所需目标的基本方法,但是要在应用中正确实现流,您应考虑使用应用范围的BloC,这将通过降低应用范围来显着提高应用质量不必要的构建数量。
答案 1 :(得分:0)
您可以将MaterialApp
小部件包装到ChangeNotifierProvider
和Consumer
小部件中,并从模型中控制语言。
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => MainModel(context: context),
child: Consumer<MainModel>(builder: (context, mainModel, child) {
return MaterialApp(
locale: Locale(mainModel.preferredLanguageCode),
....
在MainModel
上,您要做的就是将preferredLanguageCode
变量更改为所需的任何值(“ en”,“ ar”,“ es”等)。更改语言后,别忘了致电NotifyListeners()
。
此答案和另一个答案只有一个问题:context
以上的任何MaterialApp
都无法使用{{1}获取设备语言(例如,首次启动应用程序时) }。此方法需要Localizations.localeOf(context)
波纹管context
。
为解决此问题,我使用this plugin来获取设备语言,而无需使用MaterialApp
。
应用启动后,您可以根据需要更改此语言的任何方式。用户更改语言后,我还使用context
存储首选语言。
答案 2 :(得分:0)
如果您想在不重新启动应用程序且没有任何插件的情况下更改应用程序语言,则可以按照以下步骤操作:
在应用程序的主文件中,例如在StatefullWedget
中创建MyHomePage
方法static
,如下所示
setLocal
其中class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
static void setLocale(BuildContext context, Locale newLocale) async {
_MyHomePageState state =
context.findAncestorStateOfType<_MyHomePageState>();());
state.changeLanguage(newLocale);
}
@override
_MyHomePageState createState() => _MyHomePageState();
}
是您的_MyHomePageState
小部件的state
在您的MyHomePage
中创建一个state
方法static
:
changeLanguage
现在,您可以在应用程序页面中通过调用 class _MyHomePageState extends State<MyHomePage> {
Locale _locale;
changeLanguage(Locale locale) {
setState(() {
_locale = locale;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Afghanistan',
theme: ThemeData(primaryColor: Colors.blue[800]),
supportedLocales: [
Locale('fa', 'IR'),
Locale('en', 'US'),
Locale('ps', 'AFG'),
],
locale: _locale,
localizationsDelegates: [
AppLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
localeResolutionCallback: (locale, supportedLocales) {
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale.languageCode &&
supportedLocale.countryCode == locale.countryCode) {
return supportedLocale;
}
}
return supportedLocales.first;
},
initialRoute: splashRoute,
onGenerateRoute: Router.generatedRoute,
);
}
}
方法来更改语言,并按如下所示传递新的setLocal
:
Locale
请记住,您需要创建一个Locale newLocale = Locale('ps', 'AFG');
MyHomePage.setLocale(context, newLocale);
,
Here是演示应用程序的链接
答案 3 :(得分:0)
使用easy_localization软件包更容易。
例如,要更改语言:
onTap: (){
EasyLocalization.of(context).locale = Locale('en', 'US');
}
我通过以下视频了解了如何使用此软件包:Youtube Video Link