0

GetXのユーティリティ関数を使用するときに、ユーザー設定を保存する (および再起動時に取得する) 方法はありますか?

Get.changeTheme(ThemeData().dark)

としても

Get.updateLocale(Locale('en', 'US'));

これまでのところ、テーマと言語の両方を変更することしかできませんが、次回アプリを再度開いたときにロードされるように、あらゆる種類のストレージへの変更を保持する方法が GetX で見つかりませんでした。私が見落としているものはありますか?起動プロセスにフックして、保存されている値 ( などSharedPreferences) をチェックし、それらを mylocaleおよびthemeproperties に渡す方法はありますGetMaterialAppか?

これは私のコードです:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      translations: Messages(),
      locale: Get.locale,
      theme: Get.theme,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextButton(
                onPressed: () => {
                      Get.changeTheme(
                          Get.isDarkMode ? ThemeData.light() : ThemeData.dark())
                    },
                child: Text('change_theme'.tr)),
            TextButton(
                onPressed: () => {
                      Get.updateLocale(Get.locale == Locale('en', 'US')
                          ? Locale('de', 'DE')
                          : Locale('en', 'US'))
                    },
                child: Text('change_language'.tr)),
          ],
        ));
  }
}

class Messages extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        'en_US': {
          'change_theme': 'Change Theme',
          'change_language': 'Change Language',
        },
        'de_DE': {
          'change_theme': 'Farbschema wechseln',
          'change_language': 'Sprache wechseln',
        }
      };
}
4

2 に答える 2

1

これは、 GetStorageを使用すると簡単に実行できます。

明るいテーマから暗いテーマに変更するだけの場合は、テーマが変更されるたびに単純な bool を格納するだけです。

基本設定クラスでこれを行う 1 つの方法を次に示します。

class SettingsController extends GetxController {
  ThemeData themeData;

  final box = GetStorage();

  @override // called when you use Get.put before running app
  void onInit() {
    super.onInit();
    _restoreTheme();
  }

  void _restoreTheme() {
    bool isDark = box.read('isDark') ?? true; // null check for first time running this
    if (isDark) {
      themeData = ThemeData.dark();
    } else {
      themeData = ThemeData.light();
    }
  }

  void storeThemeSetting(bool isDark) {
    box.write('isDark', isDark);
  }
}

クラスのthemeData変数は、SettingsControllerストレージの bool 値に応じて初期化されます。そして、そのthemeDataファイルは、次のように に渡すものですGetMaterialApp

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final controller = Get.find<SettingsController>();
    return GetMaterialApp(
      theme: controller.themeData,
      title: 'Material App',
      home: StorageDemo(),
    );
  }
}

次に、アプリを実行する前に、これらの行を両方とも Main メソッドに入れます。

  await GetStorage.init();

  Get.put(SettingsController());

これをテストできるデモページがあります。

class StorageDemo extends StatelessWidget {
  Widget build(BuildContext context) {
    final controller = Get.find<SettingsController>();
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            TextButton(
              onPressed: () {
                Get.changeTheme(ThemeData.dark());
                controller.storeThemeSetting(true);
              },
              child: Text('Dark Theme'),
            ),
            TextButton(
              onPressed: () {
                Get.changeTheme(ThemeData.light());
                controller.storeThemeSetting(false);
              },
              child: Text('Light Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

より複雑なファイルがある場合、同じ概念が適用されますが、各色を個別に保存する必要があります。これは、色の値をThemeData保存するのが最も簡単です。int

  int colorValue = Colors.red.value; // store this int

次に、ストレージから復元するときに、この機能を使用できます

Color mapIntToColor(int value) {
    return Color(value);
  }

言語設定についても同じです。LocaleGetx クラスに変数を追加し、いくつかの文字列を保存し、アプリを実行する前に初期化してから、そのLocale変数を のロケール フィールドに渡すだけですGetMaterialApp

于 2021-03-22T16:07:03.573 に答える