Flutter:从其他页面访问存储的Sharedpreference值

时间:2018-07-06 17:14:17

标签: sharedpreferences flutter

我在page1.dart中存储了一个vlaue,我想从page2.dart或page3.dart中访问存储的值,我该如何实现?

6 个答案:

答案 0 :(得分:8)

Flutter共享首选项实际上是作为内存中的缓存实现的。首次调用SharedPreferences.getInstance()时,将从NSUserDefaults(在iOS上)和SharedPreferences(在Android上)中读取所有当前值,并将其缓存在内存中。这涉及通道,异步也是如此。 Future返回包装该缓存的单例类。随后对getInstance的任何调用都将返回此单例类。

当您从共享首选项中获取一个值时,只需从内存中的缓存中获取该值。当您设置一个值时,缓存将立即更新,并开始使用异步方法将其写回到操作系统。 (您可以等待确认完成,但不必这样做。)请注意,对缓存的读写操作是同步的,因此您可以立即访问该设置缓存。 (可能要花一些时间才能到达操作系统,因此不能保证内存中的缓存与设备的首选项相匹配,但这只能在错误情况下发生。)

之所以如此有趣,是因为一旦获得SharedPreferences.getInstance()的结果,就可以同步读取和写入值。由于实例是单例,因此保留它的副本似乎是合理的。特别是,您可以使您的主异步程序并在那里获取它。

SharedPreferences sp;

void main() async {
  sp = await SharedPreferences.getInstance();
  runApp(new MyApp());
}

这使您可以在整个代码中引用sp

  onPressed: () {
    sp.setString('abc', 'def');
  },

知道内存中的缓存是一致的。特别是,导航后,可以在另一页面中获取在一个页面中设置的任何值。

说了这么多,您可能应该将存储的首选项视为状态的一部分,刚好在启动时进行初始化,并且在设置时会触发后台任务以自动将其持久化。然后,您可以按照与其余状态相同的方式来处理首选项,但是您要这样做(继承的Widget +控制器,Redux,Streams等)。

答案 1 :(得分:3)

我在第一个屏幕中存储了一个字符串,然后通过以下代码从第二个屏幕中检索了存储的值

第1页:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _email = '';

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  _loadCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _email = (prefs.getString('email') ?? '');
    });
  }

  _incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _email = "a@gmail.com";
    });
    prefs.setString('email', _email);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("title"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '$_email',
            ),
            new RaisedButton(
              child: new Text("next2"),
              onPressed: () {
                Navigator.push(context,
                    new MaterialPageRoute(builder: (context) => new Next()));
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        child: Icon(Icons.add),
      ),
    );
  }
}

第2页:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
String _email='';
class Next extends StatefulWidget {
  @override
  _NextState createState() => _NextState();
}

class _NextState extends State<Next> {
    @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  _loadCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _email = (prefs.getString('email')??'');
    });
  }
  @override
  Widget build(BuildContext context) {

    return Container(
      child: new Text("read value from sharepreference is:"+_email),
    );
  }
}

答案 2 :(得分:2)

如果您需要在多个类中获取SharePreferences的值,则可以将常见的get和set方法 SharedPreference 放在类的静态方法中。

 import 'package:shared_preferences/shared_preferences.dart';
 class SharedPrefUtils {

    static saveStr(String key, String message) async {
       final SharedPreferences pref = await SharedPreferences.getInstance();
       pref.setString(key, message);
    }

    static readPrefStr(String key) async {
        final SharedPreferences pref = await SharedPreferences.getInstance();
        return pref.getString(key);
    }

 }

然后,在任何其他类中,使用SharedPrefUtils.readPrefStr(String key);

答案 3 :(得分:1)

首先,您需要为shared preferences函数创建自定义类。因此您可以从任何页面访问它。

import 'package:shared_preferences/shared_preferences.dart';
 
class MySharedPreferences {
  MySharedPreferences._privateConstructor();
 
  static final MySharedPreferences instance =
      MySharedPreferences._privateConstructor();
 
  setStringValue(String key, String value) async {
    SharedPreferences myPrefs = await SharedPreferences.getInstance();
    myPrefs.setString(key, value);
  }
 
  Future<String> getStringValue(String key) async {
    SharedPreferences myPrefs = await SharedPreferences.getInstance();
    return myPrefs.getString(key) ?? "";
  }
 
  Future<bool> containsKey(String key) async {
    SharedPreferences myPrefs = await SharedPreferences.getInstance();
    return myPrefs.containsKey(key);
  }
 
  removeValue(String key) async {
    SharedPreferences myPrefs = await SharedPreferences.getInstance();
    return myPrefs.remove(key);
  }
 
  removeAll() async{
    SharedPreferences myPrefs = await SharedPreferences.getInstance();
    return myPrefs.clear();
  }
 
}

储值:

 MySharedPreferences.instance.setStringValue("key", value);

获得价值:

MySharedPreferences.instance
        .getStringValue("key")
        .then((value) => setState(() {
              val result = value;
            }));

更多参考:Flutter Shared Preferences Tutorial

答案 4 :(得分:1)

将共享首选项从 main 传递到您想要的所有页面。我有 Page1.dart 作为下面的例子。可以使用相同的方法将参数传递给任何其他文件中的任何其他类。

Page1.dart

void main() async {

  // Note that this line is required, otherwise flutter throws an error 
  // about using binary messenger before runApp()
  WidgetsFlutterBinding.ensureInitialized();

  SharedPreferences sharedPref = await SharedPreferences.getInstance();
  runApp(new MyApp(sharedPref));
}

class MyApp extends StatelessWidget {
  final SharedPreferences sharedPref;

  MyApp(this.sharedPref);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(sharedPref),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final SharedPreferences sharedPref;

  MyHomePage(this.sharedPref);

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

class _MyHomePageState extends State<MyHomePage> {
  String _email = '';

  @override
  void initState() {
    super.initState();
    widget.sharedPref.setString('email', _email);
  }

  // ... rest of your code
}

答案 5 :(得分:0)

在flutter中使用SharedPreferences的最佳方法是将实例分配给全局变量,该变量在main函数中初始化,从而使函数async

通常,在起伏不定的情况下,main函数仅用于设置到其他屏幕的路线并运行该应用程序,因此,如果您的起始路线是其他任何屏幕,那么在到达该屏幕时,需要使用SharedPreferences实例,就可以使用。

真的不需要初始化功能。

相关问题