Flutter本地应用数据管理插件app_local的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter本地应用数据管理插件app_local的使用

简介

app_local 是一个轻量级且功能强大的 Flutter 包,它允许您轻松实现应用程序本地化,动态语言切换,持久设置,并支持本地设备语言 - 所有这些只需少量配置即可完成。

特性

  • 🚀 简单的应用程序本地化
  • 🔄 动态区域切换
  • 💾 自动区域持久化
  • 📱 支持手机默认语言
  • 🔌 通过 LocaleText 小部件简单集成
  • ⚡ 最小化的配置需求

示例

开始使用

1. 设置资源文件

  1. 在项目根目录下创建一个 assets/lang 文件夹。
  2. 添加您的区域 JSON 文件(例如 en.jsonar.json)。

示例区域文件:

// en.json
{
  "welcome": "Welcome to the App",
  "change_lang": "Change the language"
}

// ar.json
{
  "welcome": "مرحبا بك في التطبيق",
  "change_lang": "تغيير لغة التطبيق"
}

2. 添加依赖

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  app_local: ^latest_version

# 添加资源路径
flutter:
  uses-material-design: true
  assets:
    - assets/lang/

3. 初始化

main.dart 中添加以下代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Locales.init(
    localeNames: ['en', 'ar'],  // 您支持的语言区域
    localPath: "assets/lang/",   // 您的区域文件路径
    phoneLocale: true,          // 使用手机的默认区域
  );
  
  runApp(MyApp());
}

MaterialApp 包裹在 LocaleBuilder 中:

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return LocaleBuilder(
      builder: (locale) => MaterialApp(
        title: 'App Local',
        localizationsDelegates: Locales.delegates,
        supportedLocales: Locales.supportedLocales,
        locale: locale,
        home: HomeScreen(),
      ),
    );
  }
}

使用

显示翻译文本

使用小部件:

LocaleText('welcome');

使用字符串:

// 使用静态方法
Locales.string(context, 'welcome');

// 使用扩展方法
context.localeString('welcome');

更改区域

使用静态方法:

Locales.change(context, 'ar');

// 使用扩展方法
context.changeLocale('ar');

// 切换到设备区域
Locales.change(context, 'auto');

获取当前区域

使用静态方法:

Locales.currentLocale(context);

// 使用扩展方法
context.currentLocale;

iOS

如果您想支持设备默认语言,请在 Info.plist 文件中添加以下内容:

<key>CFBundleLocalizations</key>
<array>
  <!-- 添加您支持的语言区域 -->
  <string>en</string>
  <string>ar</string>
</array>

平台支持

平台 支持
Android
iOS
macOS
Web
Windows
Linux

默认本地语言

平台 支持
Android
iOS
macOS
Web
Windows
Linux

即将支持 Web, Windows 和 Linux。

完整示例

import 'package:flutter/material.dart';
import 'package:app_local/app_local.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Locales.init(
      localeNames: ['en', 'ar'],
      localPath: "assets/a/",
      phoneLocale: true); // 获取上次保存的语言
  // 移除 await async (以获取系统语言作为默认语言)

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return LocaleBuilder(
      builder: (locale) => MaterialApp(
        title: 'Flutter Locales',
        localizationsDelegates: Locales.delegates,
        supportedLocales: Locales.supportedLocales,
        locale: locale,
        theme: ThemeData(primarySwatch: Colors.blue),
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: LocaleText('localization')),
      body: Center(
        child: LocaleText('welcome', style: TextStyle(fontSize: 32)),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(builder: (_) => SettingScreen()));
        },
        child: Icon(Icons.settings),
      ),
    );
  }
}

class SettingScreen extends StatelessWidget {
  const SettingScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(Locales.string(context, 'setting'))),
      // 使用扩展方法
      // appBar: AppBar(title: Text(context.localeString('setting'))),
      body: Column(
        children: [
          ListTile(
            onTap: () => Locales.change(context, 'en'),
            title: LocaleText('english'),
          ),
          ListTile(
            onTap: () => Locales.change(context, 'ar'),
            title: LocaleText('arabic'),
          ),
          // 使用扩展方法更改语言
          ListTile(
            onTap: () => context.changeLocale('auto'),
            title: LocaleText('auto'),
          ),
          Text('Current Locale: ' +
              Locales.currentLocale(context)!.languageCode),
          // 使用扩展方法
          // Text('Current Locale: ' + context.currentLocale.languageCode),
        ],
      ),
    );
  }
}

更多关于Flutter本地应用数据管理插件app_local的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地应用数据管理插件app_local的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 app_local 插件在 Flutter 应用中进行本地数据管理的代码示例。app_local 插件虽然不是一个广为人知的官方或流行插件,但基于假设它提供类似 shared_preferencessqflite 的功能,我们可以编写一个通用的代码示例来展示如何使用本地存储。

为了演示,我将假设 app_local 插件提供了基本的键值对存储功能。如果 app_local 的实际 API 有所不同,请根据具体文档进行调整。

首先,确保在 pubspec.yaml 文件中添加 app_local 依赖(注意:这里的 app_local 是假设的,实际使用时请替换为真实插件名):

dependencies:
  flutter:
    sdk: flutter
  app_local: ^x.y.z  # 替换为实际版本号

然后,运行 flutter pub get 来获取依赖。

接下来,编写代码来使用这个插件:

import 'package:flutter/material.dart';
import 'package:app_local/app_local.dart';  // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Local Storage Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LocalStorageDemo(),
    );
  }
}

class LocalStorageDemo extends StatefulWidget {
  @override
  _LocalStorageDemoState createState() => _LocalStorageDemoState();
}

class _LocalStorageDemoState extends State<LocalStorageDemo> {
  final AppLocal _storage = AppLocal();
  String _savedValue = '';

  @override
  void initState() {
    super.initState();
    // 从本地存储中读取数据
    _readValueFromStorage();
  }

  Future<void> _readValueFromStorage() async {
    String? value = await _storage.getString('saved_key');
    setState(() {
      _savedValue = value ?? '';
    });
  }

  Future<void> _saveValueToStorage(String value) async {
    await _storage.setString('saved_key', value);
    setState(() {
      _savedValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Local Storage Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Enter a value'),
              onChanged: (value) {
                // 当文本改变时,可以即时保存(这里为了演示简单处理)
                _saveValueToStorage(value);
              },
            ),
            SizedBox(height: 16),
            Text(
              'Saved Value:',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            Text(
              _savedValue,
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们假设 AppLocal 类提供了 getStringsetString 方法来读取和写入字符串数据。以下是几个关键点:

  1. 初始化存储:在 initState 方法中,我们从本地存储中读取初始值。
  2. 保存数据:在文本字段的值改变时,我们调用 _saveValueToStorage 方法将数据保存到本地存储。
  3. 读取数据:我们从本地存储中读取数据并显示在界面上。

请注意,这个示例代码是基于假设的 app_local 插件的 API。如果实际使用的插件 API 不同,请根据插件的官方文档进行相应的调整。如果 app_local 实际上是一个不存在的插件,你可能需要使用如 shared_preferencessqflite 等流行的本地存储解决方案。

回到顶部