Flutter偏好设置管理插件pref的使用

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

Flutter偏好设置管理插件pref的使用

简介

pref 插件可以帮助开发者在Flutter应用中创建带有高级特性和子页面的偏好设置界面。它提供了一系列预构建的小部件,使你能够轻松地为你的应用程序添加配置选项。

Demo video

使用方法

初始化服务

在你的主方法中,确保初始化了WidgetsFlutterBinding,并设置默认的偏好值:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final service = await PrefServiceShared.init(
    defaults: {
      'start_page': 'posts',
      'ui_theme': 'light',
    },
  );

  runApp(
    PrefService(
      service: service,
      child: MyApp(),
    ),
  );
}

创建偏好设置页面

接下来,在你的UI代码中,你可以使用PrefPage和其他相关的预制小部件来创建一个直观且易于使用的偏好设置页面:

Scaffold(
  appBar: AppBar(
    title: Text('Preferences Demo'),
  ),
  body: PrefPage(children: [
    PrefTitle(title: Text('General')),
    PrefDropdown<String>(
      title: Text('Start Page'),
      pref: 'start_page',
      items: [
        DropdownMenuItem(value: 'posts', child: Text('Posts')),
        DropdownMenuItem(value: 'timeline', child: Text('Timeline')),
        DropdownMenuItem(value: 'pm', child: Text('Private Messages')),
      ],
    ),
    PrefTitle(title: Text('Personalization')),
    PrefRadio(
      title: Text('Light Theme'),
      value: 'light',
      pref: 'ui_theme',
    ),
    PrefRadio(
      title: Text('Dark Theme'),
      value: 'dark',
      pref: 'ui_theme',
    ),
  ]),
);

在应用程序中使用偏好设置值

要访问保存的偏好设置值,可以在上下文中使用PrefService.of(context)

final startPage = PrefService.of(context).get('start_page');

示例项目

为了更深入地了解如何使用pref插件,可以参考完整的示例代码。这个例子展示了如何设置和获取各种类型的偏好设置,并展示了如何处理不同种类的数据(如字符串、整数等)以及如何监听偏好设置的变化以动态更新UI。

// example/lib/main.dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:pref/pref.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 设置日志记录器
  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((record) {
    debugPrint('${record.loggerName} ${record.level.name}: ${record.message}');
  });

  // 初始化偏好服务
  final service = PrefServiceCache(); 
  await service.setDefaultValues(<String, dynamic>{
    'user_description': 'This is my description!',
    'advanced_enabled': false,
    'start_page': 'Timeline',
    'notification_pm_friend': true,
    'notification_newpost_friend': true,
    'notification_pm_stranger': false,
    'ui_theme': 'light',
    'ui_color': Colors.blue.value,
    'user_email': 'email@gmail.com',
    'gender': 2,
    'content_show_text': false,
    'content_show_image': true,
    'content_show_audio': null,
    'android_listpref_selected': 'select_3',
    'android_multilistpref_a': false,
    'android_multilistpref_b': true,
    'android_multilistpref_c': true,
    'exp_showos': false,
    'age': 65,
    'weight': 60,
  });

  runApp(MyApp(service));
}

class MyApp extends StatefulWidget {
  const MyApp(this.service, {Key? key}) : super(key: key);

  final BasePrefService service;

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  ThemeMode? _brightness;
  Color? _uiColor;

  StreamSubscription<String>? _stream;
  StreamSubscription<int?>? _streamColor;

  @override
  void dispose() {
    _stream?.cancel();
    _streamColor?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    _stream ??= widget.service.stream<String>('ui_theme').listen((event) {
      setState(() {
        switch (event) {
          case 'system':
            _brightness = ThemeMode.system;
            break;
          case 'light':
            _brightness = ThemeMode.light;
            break;
          case 'dark':
            _brightness = ThemeMode.dark;
            break;
        }
      });
    });

    _streamColor ??= widget.service.stream<int?>('ui_color').listen((event) {
      setState(() {
        _uiColor = event == null ? null : Color(event);
      });
    });

    return PrefService(
      service: widget.service,
      child: MaterialApp(
        title: 'Pref Demo',
        themeMode: _brightness,
        theme: ThemeData.light().copyWith(
            colorScheme:
                ColorScheme.fromSeed(seedColor: _uiColor ?? Colors.blue)),
        darkTheme: ThemeData.dark().copyWith(
            colorScheme: ColorScheme.fromSeed(
                seedColor: _uiColor ?? Colors.blue,
                brightness: Brightness.dark)),
        home: MyHomePage(title: 'Pref Demo'),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: PrefPage(
        children: [
          // ...此处省略部分代码...
        ],
      ),
    );
  }
}

以上就是关于pref插件的基本介绍及其用法。通过这种方式,你可以快速实现对用户偏好设置的支持,同时保持代码的简洁性和可维护性。如果你有任何疑问或需要进一步的帮助,请随时提问!


更多关于Flutter偏好设置管理插件pref的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter偏好设置管理插件pref的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,shared_preferences 是一个非常流行的插件,用于管理应用的偏好设置。尽管你提到了 pref,但我假设你是指 shared_preferences,因为 pref 并不是一个广泛认知的Flutter插件。下面是如何在Flutter中使用 shared_preferences 插件的一个代码示例。

首先,确保你已经在 pubspec.yaml 文件中添加了 shared_preferences 依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15  # 请检查最新版本号

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

接下来,在你的 Dart 代码中,你可以按照以下步骤使用 shared_preferences

  1. 导入插件
import 'package:shared_preferences/shared_preferences.dart';
  1. 初始化 SharedPreferences 实例

由于 SharedPreferences 是一个单例,你需要先获取它的实例,这通常是在应用启动时完成的。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  
  runApp(MyApp(prefs: prefs));
}
  1. 在应用中使用 SharedPreferences

在你的 Flutter 应用中,你可以通过传递 SharedPreferences 实例来使用它。下面是一个简单的示例,展示如何读写数据:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  
  runApp(MyApp(prefs: prefs));
}

class MyApp extends StatelessWidget {
  final SharedPreferences prefs;

  MyApp({required this.prefs});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SharedPreferences Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(prefs: prefs),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final SharedPreferences prefs;

  MyHomePage({required this.prefs});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(labelText: 'Enter some text'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                // 保存数据到 SharedPreferences
                await widget.prefs.setString('my_key', _controller.text);
                
                // 从 SharedPreferences 读取数据
                String? value = widget.prefs.getString('my_key');
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Saved: $value')),
                );
              },
              child: Text('Save'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,用户可以在一个 TextField 中输入文本,然后点击一个按钮将文本保存到 SharedPreferences 中。同时,我们读取之前保存的值,并在点击按钮后通过 SnackBar 显示出来。

这个示例展示了如何使用 SharedPreferences 插件在 Flutter 应用中管理偏好设置。如果你有更多具体的需求或问题,欢迎进一步提问!

回到顶部