Flutter 中使用语言国际化

539 阅读1分钟

本章接上一章内容,上一篇主要讲了在flutter如何使用多语言,本篇主要讲下如何用Provider进行状态管理来实现页面语言切换;

  1. 安装provider依赖,在pubspec.yaml中引入provider;

16214726953453.png

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  provider: ^5.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

flutter_intl:
    enabled: true
  1. 创建存储local语言的provider

16214728546225.png

import 'package:flutter/material.dart';

class LocalProvide extends ChangeNotifier {
  String currentLang = 'en';

  setLocalLanguage(curLang) {
    currentLang = curLang;
    notifyListeners();
  }
}
  1. 将provider中的local状态注入到全局,main.dart中代码如下

16214736843025.png

16214739059413.png

16214739755408.png

import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_intl/generated/l10n.dart';
import 'package:provider/provider.dart';
import 'package:flutter_intl/provider/local.dart';

void main() {
  runApp(MultiProvider(providers: [
    ChangeNotifierProvider(create: (_) => LocalProvide()),
  ], child: MyApp()));
}

ValueChanged<Locale> localeChange;

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // new 设置当前的语言
  // Locale _locale = const Locale('zh', '');
  // @override
  // void initState() {
  //   super.initState();
  //   localeChange = (locale) {
  //     setState(() {
  //       _locale = locale;
  //     });
  //   };
  // }

// new
  @override
  Widget build(BuildContext context) {
    return Consumer<LocalProvide>(
        //接收数据
        builder: (context, localProvide, child) {
      return MaterialApp(
        title: 'project',
        theme: ThemeData.dark(),
        debugShowCheckedModeBanner: false,
        localizationsDelegates: const [
          S.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate
        ],
        supportedLocales: S.delegate.supportedLocales,
        home: Builder(
          builder: (BuildContext context) {
            return Localizations.override(
              context: context,
              locale: Locale(localProvide.currentLang, ''),
              child: Scaffold(
                appBar: AppBar(
                  title: Text(S.of(context).app_name), // 在要使用的字段的位置使用配置的文案
                  centerTitle: true,
                ),
                body: Center(
                  child: Column(
                    children: [
                      Container(
                        padding: EdgeInsets.all(30),
                        height: 100,
                        child: Text(
                          S.of(context).app_name,
                          style: TextStyle(fontSize: 30),
                        ),
                      ),
                      InkWell(
                        onTap: () {
                          String curLang = localProvide.currentLang;
                          if (curLang == 'en') {
                            curLang = 'zh';
                          } else {
                            curLang = 'en';
                          }
                          Provider.of<LocalProvide>(context, listen: false)
                              .setLocalLanguage(curLang);
                        },
                        child: Text(
                          S.of(context).toggle_lang,
                          style: TextStyle(fontSize: 30),
                        ),
                      )
                    ],
                  ),
                ),
              ),
            );
          },
        ),
      );
    });
  }
}

好了这个时候点击切换语言就能实现语言实时切换了。

16214730205085.png

16214730326924.png