使用 GETX 包 Flutter 更改应用程序语言后,切换开关不会更改位置
Toggle Switch not changing position after app language is changed using GETX package Flutter
我的应用程序中有一个切换开关,用户点击它可以更改语言。在我看来,我正在使用 toggle_switch 包。我的观点是这样的:
class Welcome extends GetView<WelcomeController> {
final WelcomeController _controller = Get.put(WelcomeController());
Welcome({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
var _toggleValue = 0.obs;
return Scaffold(
body: Obx(() => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Toggle Value : ${_controller.selectedLanguage.value}'),
ToggleSwitch(
minWidth: 90.0,
cornerRadius: 20.0,
activeBgColors: [[Colors.cyan], [Colors.redAccent]],
activeFgColor: Colors.white,
inactiveBgColor: Colors.grey,
inactiveFgColor: Colors.white,
totalSwitches: 2,
labels: ['English', 'Bangla'],
onToggle: (index) {
print('switched to: $index');
changeLanguage(index);
},
),
//some other widgets
],
))
);
}
void changeLanguage(int value) {
if (value == 0) {
_controller.changeLang('en');
} else {
_controller.changeLang('bn');
}
}
}
我的控制器具有 changeLang 函数,它执行以下操作:
class WelcomeController extends GetxController{
var selectedLanguage = Get.locale!.languageCode.obs;
void changeLang(String lang) {
Locale locale = Locale(lang);
Get.updateLocale(locale);
selectedLanguage.value = lang;
}
}
如果我在切换 onToggle 函数中使用上述函数,切换位置不会移动到当前选择的索引,颜色也不会改变,但每当我点击英语或孟加拉语时,语言就会改变。我做错了什么?
要让 Switch 正常工作,move the setState(() {}) outside of Switch in a callback function
。
// Switch Widget
Switch( value: _toggleState,
onChanged: _attemptChange,
),
//Callback
void _attemptChange(bool newState) {
setState(() {
_toggleState = newState;
newState ? _switchCase = 'ON' : _switchCase = 'OFF';
});
or u can use CupertinoSwitch it has value property
set variable in your controller
CupertinoSwitch(
value: controller.boolVal,
onChanged: (bool value) {
/// change your variable value in controller
}
);
首先在controller中赋值toggleValue like
enter code here
然后在 ToggleSwitch 中添加一行,如下所示,
initialLabelIndex: _controller.toggleValue.value
添加如下更新方式
void changeLanguage(int value) {
_controller.toggleValue.value = value;
if (value == 0) {
_controller.changeLang('en');
} else {
_controller.changeLang('bn');
}
}
我的应用程序中有一个切换开关,用户点击它可以更改语言。在我看来,我正在使用 toggle_switch 包。我的观点是这样的:
class Welcome extends GetView<WelcomeController> {
final WelcomeController _controller = Get.put(WelcomeController());
Welcome({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
var _toggleValue = 0.obs;
return Scaffold(
body: Obx(() => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Toggle Value : ${_controller.selectedLanguage.value}'),
ToggleSwitch(
minWidth: 90.0,
cornerRadius: 20.0,
activeBgColors: [[Colors.cyan], [Colors.redAccent]],
activeFgColor: Colors.white,
inactiveBgColor: Colors.grey,
inactiveFgColor: Colors.white,
totalSwitches: 2,
labels: ['English', 'Bangla'],
onToggle: (index) {
print('switched to: $index');
changeLanguage(index);
},
),
//some other widgets
],
))
);
}
void changeLanguage(int value) {
if (value == 0) {
_controller.changeLang('en');
} else {
_controller.changeLang('bn');
}
}
}
我的控制器具有 changeLang 函数,它执行以下操作:
class WelcomeController extends GetxController{
var selectedLanguage = Get.locale!.languageCode.obs;
void changeLang(String lang) {
Locale locale = Locale(lang);
Get.updateLocale(locale);
selectedLanguage.value = lang;
}
}
如果我在切换 onToggle 函数中使用上述函数,切换位置不会移动到当前选择的索引,颜色也不会改变,但每当我点击英语或孟加拉语时,语言就会改变。我做错了什么?
要让 Switch 正常工作,move the setState(() {}) outside of Switch in a callback function
。
// Switch Widget
Switch( value: _toggleState,
onChanged: _attemptChange,
),
//Callback
void _attemptChange(bool newState) {
setState(() {
_toggleState = newState;
newState ? _switchCase = 'ON' : _switchCase = 'OFF';
});
or u can use CupertinoSwitch it has value property
set variable in your controller
CupertinoSwitch(
value: controller.boolVal,
onChanged: (bool value) {
/// change your variable value in controller
}
);
首先在controller中赋值toggleValue like
enter code here
然后在 ToggleSwitch 中添加一行,如下所示,
initialLabelIndex: _controller.toggleValue.value
添加如下更新方式
void changeLanguage(int value) {
_controller.toggleValue.value = value;
if (value == 0) {
_controller.changeLang('en');
} else {
_controller.changeLang('bn');
}
}