dart 如何在Flutter中将英文数字转换为另一种语言的数字(我正在使用孟加拉语)?

wmomyfyw  于 2023-09-28  发布在  Flutter
关注(0)|答案(3)|浏览(128)

我正在获取英文数字(例如123)作为整数,现在我想用另一种语言形式显示它(例如。১২৩).

我使用了一个函数,它也工作了。但是,它不能在同一个有状态类中工作多次。第一个Text小部件可以,第二个小部件不行

Column(
 children<Widget>:[
  Text(
   "${convertNumber(123)}"
  ),
  Text(
   "${convertNumber(5630)}"
  )
 ]
)
String convertNumber(int eng){
    String bengali = '';
    for(int i = 0; i < eng.toString().length; i ++){
      setState(() {
        switch(eng.toString()[i]){
          case '1':
            bengali = bengali + '১';
            break;
          case '2':
            bengali = bengali + '২';
            break;
          case '3':
            bengali = bengali + '৩';
            break;
          case '4':
            bengali = bengali + '৪';
            break;
          case '5':
            bengali = bengali + '৫';
            break;
          case '6':
            bengali = bengali + '৬';
            break;
          case '7':
            bengali = bengali + '৭';
            break;
          case '8':
            bengali = bengali + '৮';
            break;
          case '9':
            bengali = bengali + '৯';
            break;
          default:
            bengali = bengali + '0';
        }
      });
    }
    return bengali;
  }

当我将它用于同一个有状态类中的其他数字时,它不起作用。错误是:

在构建过程中调用setState()或markNeedsBuild()此LowerHalf小部件无法标记为需要构建,因为框架已经在构建小部件的过程中。只有当小部件的祖先之一当前正在构建时,才可以将小部件标记为需要在构建阶段构建。这个异常是允许的,因为框架在子部件之前构建父部件,这意味着总是会构建脏后代。否则,框架可能不会在此构建阶段访问此小部件。调用setState()或markNeedsBuild()的小部件是:下半部分

t98cgbkg

t98cgbkg1#

不要在 convert 函数中调用 setState,只需使用您的函数来获取值。
在调用 setState 函数后,小部件会重新生成。在您的示例中,build 调用再次触发 buildsetState

blpfk2vs

blpfk2vs2#

创建一个新的函数,并在转换后返回字符串。
下面的功能是将数字从英语转换为印地语或古吉拉特语的基础上用户选择的语言应用程序。

translateMobileNumber(String mobileNumber) {
var mobileNumberTrim = mobileNumber.toString().trim();
var translatedNumber = '';
var currentLan = 'gu';
switch (Get.locale.toString().substring(0, 2)) {
  case 'gu':
    currentLan = 'gu';
    break;
  case 'hi':
    currentLan = 'hi';
    break;
  case 'en':
    currentLan = 'en';
    break;
  default:
    currentLan = 'en';
    break;
}
if (currentLan == 'en') {
  return mobileNumberTrim;
}
for (int i = 0; i < mobileNumberTrim.length; i++) {
  switch (mobileNumberTrim[i]) {
    case '0':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૦' : '$translatedNumber૦';
      break;
    case '1':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૧' : '$translatedNumber१';
      break;
    case '2':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૨' : '$translatedNumber२';
      break;
    case '3':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૩' : '$translatedNumber३';
      break;
    case '4':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૪' : '$translatedNumber४';
      break;
    case '5':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૫' : '$translatedNumber५';
      break;
    case '6':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૬' : '$translatedNumber६';
      break;
    case '7':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૭' : '$translatedNumber७';
      break;
    case '8':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૮' : '$translatedNumber८';
      break;
    case '9':
      translatedNumber =
          currentLan == 'gu' ? '$translatedNumber૯' : '$translatedNumber९';
      break;
  }
}
return translatedNumber;

}

vcirk6k6

vcirk6k63#

我已经在hrk_batteries包中发布了String的localizeDigits()扩展方法。
添加包:

$ dart pub add hrk_batteries

如下所示:
localized_digits_example.dart

import 'package:hrk_batteries/hrk_batteries.dart';

void main() {
  final String enToBnLocalizedString = 'A0123456789Z'.localizeDigits(
    toZeroDigit: '\u09e6',
  );
  print(enToBnLocalizedString); // A০১২৩৪৫৬৭৮৯Z
}

相关问题