Flutter 中是否可以监听系统语言的变化?

2024-01-03

当用户更改系统语言时是否可以收听?当用户更改语言时,我需要清除一些列表。现在我正在检测中的语言void main()启动时运行。


void main() async {
  // Firebase Push Notifications initialization
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(backgroundHandler);
  detectLanguageChange();
  WidgetsBinding.instance.addObserver(this);


  runApp(const MyApp());
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
 @override
  void initState() {
    super.initState();
    WidgetsBinding.instance!.addObserver(this);
  }

  @override
  void didChangeLocales(List<Locale>? locales) {
    // TODO: implement didChangeLocales
    super.didChangeLocales(locales);

    print("Locales changed");
  }

每次语言更改时都需要运行“DetectLanguage”。


可以创建一个有状态的小部件来充当WidgetsBindingObserver并接收区域设置更改didChangeLocales打回来。

让我提供一个最小的示例小部件:

import 'package:flutter/material.dart';

class LocaleListenerWidget extends StatefulWidget {
  final Locale defaultLocale;
  final Widget? child;
  
  const LocaleListenerWidget({super.key, this.defaultLocale = const Locale('en_US'), this.child});

  @override
  State<LocaleListenerWidget> createState() => _LocaleListenerWidgetState();
}

class _LocaleListenerWidgetState extends State<LocaleListenerWidget>
    with WidgetsBindingObserver {
  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void didChangeLocales(List<Locale>? locales) {
    super.didChangeLocales(locales);

    // Here locales is a list of all the locales enabled on the device.
    // Like: [Locale('en_US'), Locale('ar_SA')]

    // The first locale is the phone's main locale, but in reality you should
    // traverse until you find a supported locale.
    final currentLocale = locales?.first ?? widget.defaultLocale;
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return widget.child ?? const SizedBox.shrink();
  }
}

然后你只需要把这个小部件放在树中足够高的位置即可。例如进入你的MaterialApp's builder:

void main() {
  runApp(MaterialApp(builder: (context, child) => const LocaleListenerWidget(child: child)));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 中是否可以监听系统语言的变化? 的相关文章

随机推荐