You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何从SharedPreferences设置全局变量并跨页面使用?

问题解答

一、基于SharedPreferences实现全局可访问的用户数据

你可以把SharedPreferences封装成单例类,提前初始化后就能在任意页面直接访问属性,不用每次异步获取。

1. 封装单例类

创建MySharedPreferences类,用单例模式保证全局唯一实例,同时封装username和job的 getter 方法:

import 'package:shared_preferences/shared_preferences.dart';

class MySharedPreferences {
  // 单例实例
  static final MySharedPreferences _instance = MySharedPreferences._internal();
  late SharedPreferences _prefs;

  // 工厂构造函数,返回单例
  factory MySharedPreferences() => _instance;

  // 私有构造函数
  MySharedPreferences._internal();

  // 初始化方法,必须在APP启动时调用
  Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  // 获取用户名
  String? get username {
    final dataList = _prefs.getStringList('mySp');
    return dataList?.isNotEmpty == true ? dataList[0] : null;
  }

  // 获取职位
  String? get job {
    final dataList = _prefs.getStringList('mySp');
    return dataList?.length >= 2 ? dataList[1] : null;
  }

  // 替换你原来的保存方法
  Future<void> saveUserData(String username, String job) async {
    await _prefs.setStringList('mySp', [username, job]);
  }
}

2. APP启动时初始化

在main函数里先初始化这个类,确保后续访问时SharedPreferences已就绪:

import 'package:flutter/material.dart';

void main() async {
  // 保证初始化SharedPreferences时Flutter环境已就绪
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化单例
  await MySharedPreferences().init();
  runApp(const MyApp());
}

3. 在页面中调用

现在就能像你想要的那样,直接在page.dart里使用:

Text(MySharedPreferences().username ?? '未获取到用户名')

二、不使用SharedPreferences的全局变量方案

如果不需要持久化(APP重启后数据可丢失),可以用以下几种方式:

1. 内存单例类

直接创建存内存数据的单例类,API获取数据后赋值,其他页面直接访问:

class UserGlobalData {
  static final UserGlobalData _instance = UserGlobalData._internal();
  String? username;
  String? job;

  factory UserGlobalData() => _instance;

  UserGlobalData._internal();

  // API拿到数据后调用这个方法赋值
  void setUserData(String username, String job) {
    this.username = username;
    this.job = job;
  }
}

使用示例:

// API请求成功后赋值
UserGlobalData().setUserData('张三', '前端开发');

// 在page.dart中调用
Text(UserGlobalData().username ?? '未登录')

2. 状态管理工具(适合响应式场景)

如果需要数据变化时页面自动刷新,可以用Provider、GetX这类状态管理工具。以Provider为例:

步骤1:创建状态类

import 'package:flutter/material.dart';

class UserProvider extends ChangeNotifier {
  String? _username;
  String? _job;

  String? get username => _username;
  String? get job => _job;

  void setUserData(String username, String job) {
    _username = username;
    _job = job;
    // 通知所有监听页面刷新
    notifyListeners();
  }
}

步骤2:注册状态

在main函数里把状态提供给整个APP:

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => UserProvider(),
      child: const MyApp(),
    ),
  );
}

步骤3:赋值与调用

// API请求成功后赋值(需要context)
Provider.of<UserProvider>(context, listen: false).setUserData('张三', '前端开发');

// 在page.dart中调用(自动响应数据变化)
Consumer<UserProvider>(
  builder: (context, provider, child) {
    return Text(provider.username ?? '未登录');
  },
)

内容的提问来源于stack exchange,提问作者Pointer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:35:23