Flutter中解决Object无法赋值给String参数错误及生日持久化
错误原因
你遇到的The argument type 'Object' can't be assigned to the parameter type 'String'错误,本质是直接用SharedPreferences.get()方法取值时,它返回的是Object?类型,无法直接赋值给String类型变量。正确做法是用getString()方法获取字符串类型存储值,同时处理null场景。
完整实现方案与修正代码
1. 确认依赖
先确保pubspec.yaml中添加了shared_preferences依赖:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2 # 建议使用最新版本
2. 修正后的完整代码
以下是包含正确持久化逻辑的生日选择器代码:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:intl/intl.dart'; class BirthdayPicker extends StatefulWidget { const BirthdayPicker({super.key}); @override State<BirthdayPicker> createState() => _BirthdayPickerState(); } class _BirthdayPickerState extends State<BirthdayPicker> { String _selectedDate = "Birthday"; final DateFormat _dateFormatter = DateFormat('yyyy-MM-dd'); @override void initState() { super.initState(); _loadSavedBirthday(); // 初始化时加载已保存的日期 } // 从SharedPreferences加载生日 Future<void> _loadSavedBirthday() async { final prefs = await SharedPreferences.getInstance(); // 用getString直接获取String类型值,避免Object类型不匹配 final savedDate = prefs.getString('user_birthday'); if (savedDate != null) { setState(() { _selectedDate = savedDate; }); } } // 将选中的生日保存到SharedPreferences Future<void> _saveBirthday(String date) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('user_birthday', date); } // 日期选择器触发逻辑 Future<void> _showDatePicker() async { final pickedDate = await showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime(1900), lastDate: DateTime.now(), ); if (pickedDate != null) { final formattedDate = _dateFormatter.format(pickedDate); setState(() { _selectedDate = formattedDate; }); await _saveBirthday(formattedDate); // 保存选中的日期 } } @override Widget build(BuildContext context) { return Column( children: [ TextButton( onPressed: _showDatePicker, child: Text( _selectedDate, style: const TextStyle(fontSize: 16), ), ), ], ); } }
3. 关键修正说明
- 替换
get()为getString():直接获取String类型的存储值,从根源避免Object类型不匹配问题。 - 初始化加载逻辑:在
initState中调用_loadSavedBirthday,确保App重启后自动恢复上次选中的日期。 - null值处理:如果没有保存过日期,保持初始的"Birthday"文本显示。
- 选中后即时保存:选择日期完成后,立刻将格式化后的日期字符串存入SharedPreferences。
验证方式
- 运行App,选择一个生日日期后关闭App。
- 重启App,界面会直接显示上次选中的日期,而非初始文本。
内容的提问来源于stack exchange,提问作者Dasun Dola
相关产品推荐
相关产品推荐

