记一次Flutter适配阿拉伯语Bug

302 阅读1分钟

问题:

适配阿拉伯语需要考虑 RTL(Right-to-Left)布局文本方向文化差异 等适配问题,其中包括侧滑返回方向,阿拉伯语书写方向是从右到左的,侧滑返回时方向也需要从右到左侧滑返回。

正常情况下,多语言切换语种为阿拉伯语后,正常能切换侧滑方向的:

Get.updateLocale(Locale("ar"));

但是切换后一直无效,侧滑方向还是从左到右,排查了很久都没找到问题,

排查

通过不断注释代码才找到问题所在:

GetMaterialApp(
      debugShowCheckedModeBanner: false,
      initialBinding: BindingsBuilder(
            () {
        },
      ),
      getPages: routes,
      initialRoute: launch,
      builder: (context, Widget? widget) {
        /// 问题在这里
        var easyBuilder = EasyLoading.init();
        var widgetEasyLoading = easyBuilder(context, widget);
        return FToastBuilder()(context, widgetEasyLoading);
      },
      navigatorKey: navigatorKey,
      navigatorObservers: [],
);

注释掉builder代码后正常了,排查发现 FToastBuilder()这段代码有问题,查看源码如下:

TransitionBuilder FToastBuilder() {
  return (context, child) {
    return _FToastHolder(
      child: child!,
    );
  };
}
class _FToastHolder extends StatelessWidget {
  const _FToastHolder({Key? key, required this.child}) : super(key: key);
  final Widget child;
  @override
  Widget build(BuildContext context) {
    final Overlay overlay = Overlay(
      initialEntries: <OverlayEntry>[
        OverlayEntry(
          builder: (BuildContext ctx) {
            return child;
          },
        ),
      ],
    );
    return Directionality(
      textDirection: TextDirection.ltr,
      child: overlay,
    );
  }
}

原来是FToastBuilder源码中写死了对齐方式。被坑死了... 最后注释掉该代码即可。