首页
学习
活动
专区
工具
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 中,需要使用时再反序列化回来。

相关搜索:类型“List<dynamic>”不是类型“List<String>”flutter的子类型类型“list<dynamic>”不是类型“string”flutter的子类型flutter:类型“List<dynamic>”不是类型“List<DropdownMenuItem<String>>”的子类型类型“List<String>”不是类型“String”的子类型Flutter - String,dynamic不是List<dynamic>类型的子类型“‘String”不是类型“List<String>”的子类型类型“String”不是类型转换中类型“List<String>”的子类型?未处理的异常:类型'List<String>‘不是类型cast - FLUTTER中类型'String’的子类型类型“string”不是类型“list<latlng>”的子类型颤动类型“List<dynamic>”不是类型“List<String>”的子类型_TypeError (类型“List<String>”不是类型“UnmodifiableListView<String>”的子类型)“List<dynamic>”不是“List<String>”类型的子类型Flutter:类型“String”不是类型“DateTime”的子类型类型“Null”不是类型“String”Flutter的子类型类型“String”不是“function result”的类型“List<String>”的子类型错误“类型'Future<dynamic>‘不是类型'StreamTransformer<List<String>,List<String>>’的子类型”Flutter: InternalLinkedHashMap<String,dynamic>‘不是类型转换中类型'List<dynamic>’的子类型错误:类型'String‘不是类型'List<dynamic>’的子类型未处理的异常:类型'String‘不是'List<String>’类型的子类型Flutter Error“不是'String‘类型的子类型
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java中将Object类型转换成String类型

String.valueOf(Object) 从下图(a图)StringvalueOf(Object)源码可以看到,当传入值为null时候返回是“null”字符串,而不是null,所以在这里如果想判断这个...示例如下(b图) a图:string类valueOf(Object)源码 b图:示例 public void testObject(){ Object o = null ; String s...Object.toString() 上a图string类valueOf(Object)源码中,可以看到这里最终还是调用Object.toString()这个方法,所以可以直接用此方法转换成字符串。...注意:必须保证Object不是null值,否则将抛出NullPointerException异常。 可以先判断Object对象不为null时候,再转换成字符串 。 3....(String)Object 需要转换类型必须是能够转换为String类型,否则会出现CalssCastException异常错误。

1.3K50

Flutter】Dart 数据类型 ( var 数据类型 | Object 数据类型 )

(d.runtimeType); // 打印 var 变量值 print(d); } 运行结果 : d 变量类型被自动推断为 String 类型 ; String CSDN 二、..., 再次为其赋值 int 类型 , 此时编译时就会被报错 , 三、 Object 类型 ---- Object 是 所有对象基类 , 其中定义了一些方法 , 定义 Object 类型变量后 ,...// 打印 var 变量值 print(d); } 运行结果 : 变量 d 运行时类型String 类型 ; String CSDN Object 变量与 dynamic 变量区别是..., Object 数据类型是确定 , 就是 Object 类型 , Object 类型变量不能调用 Object 类中不存在方法 ; 四、 完整代码示例 ---- 完整代码示例 : import...(d); // 调用 Object 不存在方法就会报错 //d.getName() } } 运行结果 : String CSDN int 666 String CSDN String

2.9K00
  • java stringobject_java 类型转换 ObjectString互转

    */ if(String.valueOf(o) == null){…} 应该是 if(String.valueOf(o) == “null”){…} 方法3:采用类型转换(String)object方法...使用这种方法,最好先通过instanceof()判断被转换类型能不能强制转为String类型。...boolean result = object instanceof class 判断其左边对象是否为其右边类实例或者可以转化为右边类,返回boolean类型数据 使用这种方法时,需要注意类型必须能转成...Object是可以通过强制转换成为String Integer不能通过强制转换成String。...总结: 使用Object.toString()方法 对象不能为null 使用String.valueOf(),注意返回值:如果其他对象为null,返回字符串“null”而不是null对象 String

    2.5K40

    java把string转int类型_java把String类型转换为int类型方法

    java把String类型转换为int类型方法 发布时间:2020-08-20 14:32:03 来源:亿速云 阅读:73 作者:小新 这篇文章将为大家详细讲解有关java把String类型转换为int...在java中,实现String类型转换为int类型方法有:Integer.parseInt(String)方法、Integer.valueOf(String)方法。...本篇文章就给大家介绍java把String类型转换为int类型两种方法,让大家了解String类型如何可以转换为int类型,希望对你们有所帮助。...你会看到像这样编译错误: 2、Integer.valueOf(String)方法 valueOf()同样是Integer包装类一个方法,可以将String类型值转换为int类型值。...)方法与parseInt(String)方法类似,使用该方法时,字符串中所有字符都必须是数字,但第一个字符可以是减号“ – ”;且当String类型不是所有字符都为数字时,也会抛出异常:NumberFormatException

    4.1K10

    go string类型特性

    获取ascii类型字符长度个数和获取utf8类型字符长度个数 a. len("咪咪") //return 6 这获取是ASCII长度 b.utf8.RuneCountInString("咪咪")...字符串遍历, 以ASCII方式遍历和以Unicode方式遍历 // 测试字符串长度 str := "我是 abcd" // ASCII码类型遍历 for i := 0; i < len(str);...类型强转 1 //类型强转 2 str := "这是一个aaa" 3 bytestr := []byte(str) 4 fmt.Println(bytestr) 5 fmt.Println(string...(bytestr)) a. string强转成byte: []byte(str) b. byte强转成string: string(byte) 4....常用一些格式化样式中动词及功能 动 词 功 能 %v 按值本来值输出 %+v 在 %v 基础上,对结构体字段名和值进行展开 %#v 输出 Go 语言语法格式值 %T 输出 Go 语言语法格式类型和值

    98820

    Redis中String类型

    Redis-String 本文章记录Redis中String数据类型笔记 结构 内部编码 命令和栗子 结构 key value hello world(字符串) counter 1(整型Redis这里会字符串类型转换...PS:「value最多存512MB上限」,Redis字符串类型用于场景这里举几个栗子,缓存,计数器(播放量和浏览量等),分布式锁等等。...内部编码 String类型内部编码有三个分别是int,raw,embstr,下面介绍一下它们: 「int编码」 :保存long型64位有符号整数 「raw编码」:保存长度小于44字节字符串 「embstr...编码」:保存长度大于44字节字符串 可以利用object encoding key 进行查看String类型key用那些内部编码 127.0.0.1:6379> object encoding str...:6379> set str 1234567891234567899999 OK 127.0.0.1:6379> object encoding str "embstr" 命令和栗子 「get,set,

    1.3K20

    转成String类型几种方式

    (xx),但不能直接使用 xx.toString()方法(基本数据类型不具备方法和属性),也不能通过(String)进行强制类型转化String.valueOf(Object) 是在 Object.toString...() 基础上实现,源码:public static String valueOf(Object obj) { return (obj == null) ?...方法,比如使用Integer.toString(int i)方法注意:当使用 object.toString() 时,必须确保 object 不是 null 值,否则会抛出 NullPointerException...强制类型转换 (String) object基本数据类型不能直接通过强制类型转换 (String) 转换为字符串,因为基本数据类型不是对象,可以将基本数据类型包装为对应包装类,然后再强制转换为字符串用强制类型转换...:i + ""4、强制类型转换 (String) object6.

    50320

    redislist类型(链表结构)

    索引上值 6:llen key 计算链接表元素个数 7:linsert key after|before search value 作用: 在key链表中寻找’search’,并在search值之前...linsert key after|before search value演示 8:rpoplpush source dest 作用: 把source尾部拿出,放在dest头部, 并返回 该单元值...注意:没有lpoprpush命令 场景: task + bak 双链表完成安全队列 命令其实很简单,下面写一段伪代码,基本就明白优势了 task中存在是需要处理对象 while($task = rpoplpush...(task,bak)){ //取出task中元素并且放到dest中 ?...task); //处理取出task元素 if($result){ //如果处理成功 lpop(bak); //删除掉bak中刚取出元素 } } 这样在bak队列中留下元素就是未处理成功元素

    79240
    领券