使用 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');
   }
}