当前位置: 首页 > news >正文

【Flutter】多语言适配-波斯语RTL从右到左

前言

在多语言适配的时候,波斯语的显示是从右到左的,需要针对一些控件进行单独适配。

核心逻辑:根据语言动态设置 Directionality

Widget build(BuildContext context) {final isRtl = Localizations.localeOf(context).languageCode == 'fa';return Directionality(textDirection: isRtl ? TextDirection.rtl : TextDirection.ltr,child: YourMainWidget(),);
}

结合 MaterialApp 自动判断 Locale 设置方向

class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(localizationsDelegates: const [GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,GlobalCupertinoLocalizations.delegate,],supportedLocales: const [Locale('en'),Locale('fa'),],builder: (context, child) {final locale = Localizations.localeOf(context);final isRtl = locale.languageCode == 'fa';return Directionality(textDirection: isRtl ? TextDirection.rtl : TextDirection.ltr,child: child!,);},home: HomePage(),);}
}

控制单个组件方向(局部 RTL / LTR)

你可以按需局部设置 TextField、Text、Row 等的方向:

final isRtl = Localizations.localeOf(context).languageCode == 'fa';TextField(textDirection: isRtl ? TextDirection.rtl : TextDirection.ltr,textAlign: isRtl ? TextAlign.right : TextAlign.left,
)
Row(textDirection: isRtl ? TextDirection.rtl : TextDirection.ltr,children: [...],
)

工具函数封装建议(便于项目统一处理)

你可以写一个统一函数判断是否是 RTL 语言:

bool isRtlLanguage(BuildContext context) {final lang = Localizations.localeOf(context).languageCode;return lang == 'fa' || lang == 'ar' || lang == 'he';
}

特别提示

  1. TextAlign.start / TextAlign.end 会自动适配方向,不建议用 TextAlign.left/right。

  2. 推荐使用AlignmentDirectional,不建议使用Alignment。

  3. EdgeInsetsDirectional 自动适配左右方向,推荐代替 EdgeInsets.only(left/right)。

  4. 自动方向适配依赖于你在 MaterialApp 中设置正确的 locale 和 supportedLocales。

  5. 推荐使用BorderDirectional,不推荐使用Border。

  6. 推荐使用BorderRadiusDirection,不推荐使用BorderRadius。

http://www.dtcms.com/a/208368.html

相关文章:

  • 怎么判断一个Android APP使用了flutter 这个跨端框架
  • ITK-读取DICOM文件标签
  • Linux火墙管理及优化
  • C++中IOstream解析
  • JAVA05基本数据类型和包装类的转换,转换成其他数据类型,包装类与字符串的转换+学生类的定义实例
  • 店铺长尾销售与动销率转型及开源AI智能名片链动2+1模式S2B2C商城小程序源码应用探讨
  • CloudCanal RAG x Ollama 构建全栈私有 AI 服务
  • C++可变参数宏定义语法笔记
  • 关于flutter中Scaffold.of(context).openEndDrawer();不生效问题
  • 【Golang笔记03】error、panic、fatal错误处理学习笔记
  • Go语言中内存释放 ≠ 资源释放
  • Java详解LeetCode 热题 100(20):LeetCode 48. 旋转图像(Rotate Image)详解
  • Linux入门(九)任务调度
  • 【Go】1、Go语言基础
  • 【Java高阶面经:消息队列篇】23、Kafka延迟消息:实现高并发场景下的延迟任务处理
  • 今日行情明日机会——20250523
  • Selenium 测试框架 - Java
  • el-input宽度自适应方法总结
  • 深入解析Spring Boot与Redis集成:高性能缓存实践
  • [crxjs]自己创建一个浏览器插件
  • Android中Binder驱动作用?
  • 【AS32X601驱动系列教程】GPIO_点亮LED详解
  • 服务器修改/home的挂载路径
  • HTB-Season8-Puppy-WriteUp
  • Teensy LC 一款由 PJRC 公司开发的高性能 32 位微控制器开发板
  • 图解深度学习 - 机器学习简史
  • 【Mini-F5265-OB开发板试用测评】2、关于platform.c中的串口号初始化修改的建议
  • vue中v-clock指令
  • 分布式消息队列kafka详解
  • Vue3.5 企业级管理系统实战(二十):角色菜单