首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter SharedPreferences类型“String”不是类型“List<Object>”的子类型

基础概念

SharedPreferences 是 Flutter 中用于存储轻量级数据的机制,类似于 Android 平台上的 SharedPreferences。它允许你存储键值对数据,通常用于存储应用的配置信息、用户偏好设置等。

问题描述

你遇到的问题是:尝试将一个 List<Object> 类型的数据存储到 SharedPreferences 中,但 SharedPreferences 只支持基本数据类型(如 Stringintbool 等)和它们的集合类型(如 List<String>Set<String> 等),而不支持 List<Object> 类型。

原因

SharedPreferences 的设计初衷是为了存储简单的键值对数据,因此它只支持基本数据类型及其集合类型。List<Object> 包含了任意类型的对象,这使得数据的序列化和反序列化变得复杂且不可控。

解决方案

为了将 List<Object> 存储到 SharedPreferences 中,你需要将其转换为 SharedPreferences 支持的数据类型。常见的做法是将 List<Object> 序列化为 String(例如使用 JSON 格式),然后再存储。

示例代码

代码语言:txt
复制
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SharedPreferences Example')),
        body: Center(child: StoreListExample()),
      ),
    );
  }
}

class StoreListExample extends StatefulWidget {
  @override
  _StoreListExampleState createState() => _StoreListExampleState();
}

class _StoreListExampleState extends State<StoreListExample> {
  List<Object> _list = [1, 'two', {'key': 'value'}];

  void _saveList() async {
    final prefs = await SharedPreferences.getInstance();
    final jsonString = jsonEncode(_list);
    await prefs.setString('myList', jsonString);
  }

  List<Object> _loadList() async {
    final prefs = await SharedPreferences.getInstance();
    final jsonString = prefs.getString('myList');
    if (jsonString != null) {
      return jsonDecode(jsonString);
    }
    return [];
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _saveList,
          child: Text('Save List'),
        ),
        ElevatedButton(
          onPressed: () async {
            final loadedList = await _loadList();
            print('Loaded List: $loadedList');
          },
          child: Text('Load List'),
        ),
      ],
    );
  }
}

参考链接

通过这种方式,你可以将 List<Object> 序列化为 String 并存储到 SharedPreferences 中,需要使用时再反序列化回来。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券