在没有未来构建器的情况下从 SharedPreferences 获取价值

Get value from SharedPreferences without future builder

我需要从共享首选项中获取一个存储值并将其放入文本小部件中。没有未来的建设者,我怎么能做到这一点?

_currPage() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int page = prefs.getInt('currPage') ?? 0;
  return page;
}
class _AllTasksPageState extends State<AllTasksPage> {
  @override
  Widget build(BuildContext context) {
  ...
  Text(_currPage()); //not working
  ...
  }
}

为共享首选项创建一个助手class

import 'package:shared_preferences/shared_preferences.dart';

class SPHelper {
  SPHelper._();
  static SPHelper sp = SPHelper._();
  SharedPreferences? prefs;
  Future<void> initSharedPreferences() async {
    prefs = await SharedPreferences.getInstance();
  }

  Future<void> save(String name, String value) async {
    await prefs!.setString(name, value);
  }

  String? get(String key) {
    return prefs!.getString(key);
  }

  Future<bool> delete(String key) async {
    return await prefs!.remove(key);
  }
}

在你的主函数中添加

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SPHelper.sp.initSharedPreferences();
  ...
  runApp(MyApp());
  ...
}

然后让你的数据只是写 SPHelper.sp.get("YOUR_KEY")

并存储您的数据只需写入 SPHelper.sp.save("YOUR_KEY","YOUR_VALUE")

这是使用共享首选项的最佳方式。

希望对您的问题有所帮助。

如果您不想使用未来的构建器,另一个解决方案是如果您有一个变量告诉您​​您仍然是 waiting/loading 数据,如果是,则显示等待屏幕:

class _AllTasksPageState extends State<AllTasksPage> {
bool _loading = true;
String? textValue; // String textValue = "";

@override
initState() {
   super.initState();
   setTextValue();
}

setTextValue() {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int page = prefs.getInt('currPage') ?? 0;
  setState(() {
     textValue = "$page";
     _loading = false;
  });
}


// then in the build method
 @override
 Widget build(BuildContext context) {
   return _loading ? CircularProgressIndicator() : actualScreen();
 }
}
  int page = 0;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('$page'),
      ),
    );
  }

  void readData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    if (prefs.getInt('currPage') == null)
      setState(() => page = 0);
    else
      setState(() => page = prefs.getInt('currPage')!);
  }

最简单的方法是使用 SharedPreferences 提供程序:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(
    MultiProvider(
      providers: [
        Provider.value(value: await SharedPreferences.getInstance()),
      ],
      child: MaterialApp(
        home: AllTasksPage(),
      ),
    ),
  );
}

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

  @override
  Widget build(BuildContext context) {
    final page = context.read<SharedPreferences>().getInt('currPage') ?? 0;
    return Scaffold(body: Text('$page'));
  }
}