当用户点击以保存文章并将其传递到收藏夹页面时,我在尝试从文章中保存 ID 时遇到了这个问题。 每次我转到收藏夹页面时,我都会收到此错误消息“从 SharedPreferences 加载时出错:FormatException:无效的 radix-10 数字(在字符 1 处)” 我能做些什么来解决它?
这是 ChangeNotifier 页面
class FavoriteArticles extends ChangeNotifier {
/// Shared preferences : favorites list key
static const String _favoriteArticleIdsKey = 'favoriteArticleIds';
List<int> _favoriteArticleIds = [];
List<int> get favoriteArticleIds => _favoriteArticleIds;
int get favoriteCount {
return _favoriteArticleIds.length;
}
/// Add article
void addFavorite({required int id, required String urlImage, required String title}) async {
if (!_favoriteArticleIds.contains(id)) {
_favoriteArticleIds.add(id);
await saveToSharedPreferences();
notifyListeners();
}
}
/// Remove article
void removeFavorite(int id) async {
if (_favoriteArticleIds.contains(id)) {
_favoriteArticleIds.remove(id);
await saveToSharedPreferences();
notifyListeners();
}
}
/// Function save article
void toggleFavorite(int id, String urlImage, String title) async {
if (_favoriteArticleIds.contains(id)) {
_favoriteArticleIds.remove(id);
} else {
_favoriteArticleIds.add(id);
}
await saveToSharedPreferences();
notifyListeners();
}
/// Bool is favourite article
bool isFavorite(int id) {
return _favoriteArticleIds.contains(id);
}
/// Save article
Future<void> saveToSharedPreferences() async {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setStringList(_favoriteArticleIdsKey, _favoriteArticleIds.map((id) => id.toString()).toList());
} catch (e) {
print('Error saving to SharedPreferences: $e');
}
}
/// Load saved article
Future<void> loadFromSharedPreferences() async {
try {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final List<String>? favoriteArticleIdsStringList = prefs.getStringList(_favoriteArticleIdsKey);
if (favoriteArticleIdsStringList != null) {
_favoriteArticleIds = favoriteArticleIdsStringList.map((id) => int.parse(id, radix: 10)).toList();
print('articleIds: $_favoriteArticleIds');
}
} catch (e) {
print('Error loading from SharedPreferences: $e');
_favoriteArticleIds = [];
}
}
}
这是最喜欢的页面,一旦保存的文章应该出现在这里
class _FavoritePageState extends State<FavoritePage> {
late List data = [];
late List<int> _favoriteArticleIds = [];
List<int> get favoriteArticleIds {return _favoriteArticleIds;}
static const String _favoriteArticleIdsKey = 'favoriteArticleIds';
Future<void> loadFromSharedPreferences() async {
try {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final List<String>? favoriteArticleIdsStringList = prefs.getStringList(_favoriteArticleIdsKey);
if (favoriteArticleIdsStringList != null) {
print('favoriteArticleIdsStringList: $favoriteArticleIdsStringList');
_favoriteArticleIds = favoriteArticleIdsStringList.map((id) => int.parse(id, radix: 10)).toList();
print('articleIds: $_favoriteArticleIds');
}
} catch (e) {
print('Error loading from SharedPreferences: $e');
_favoriteArticleIds = [];
}
}
@override
void initState() {
super.initState();
loadFromSharedPreferences();
data = [
widget.data,
widget.id,
widget.urlImage,
widget.title,
widget.description,
];
}
@override
Widget build(BuildContext context) {
final favoriteArticles = Provider.of<FavoriteArticles>(context);
final articleIds = favoriteArticles.favoriteArticleIds;
final favoriteData = (widget.data ?? []).where((article) => articleIds.contains(article['id'])).toList();
print('articleIds: $articleIds');
print('filteredData: $favoriteData');
return Scaffold(
appBar: AppBar(
backgroundColor: assofacileMainColor,
centerTitle: true,
elevation: 0,
leading: Builder(
builder: (BuildContext context) {
return IconButton(
icon: const Icon(Icons.arrow_back_ios_rounded, color: Colors.white,),
onPressed: () {Navigator.of(context).pop();},
tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
);
},
),
title: const Text(
"Articoli Preferiti",
style: TextStyle(
color: Colors.white,
fontFamily: "Raleway",
fontSize: 18,
fontWeight: FontWeight.w600),
),
),
body:
FutureBuilder(
future: Provider.of<FavoriteArticles>(context, listen: false).loadFromSharedPreferences(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Consumer<FavoriteArticles>(
builder: (context, favoriteArticles, _) {
final articleIds = favoriteArticles.favoriteArticleIds;
if (favoriteData.isEmpty && data == null) {
return const EmptyArticle();
} else if (favoriteData.isNotEmpty) {
final favoriteData = data.where((article) =>
articleIds.contains(article['id'])).toList();
return ListView.builder(
itemCount: favoriteData.length,
itemBuilder: (context, index) {
final articleData = favoriteData[index];
return Card(
margin: const EdgeInsets.all(8),
elevation: 5,
shadowColor: Colors.black26,
color: Colors.white,
child: InkWell(
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
height: 190,
width: double.infinity,
child: Image(
image: AdvancedNetworkImage(
articleData["_embedded"]['wp:featuredmedia'][0]["media_details"]["sizes"]["medium"]["source_url"],
useDiskCache: true,
cacheRule: const CacheRule(
maxAge: Duration(days: 1)),
),
fit: BoxFit.cover,
),
),
// Title article
Column(
children: [
Padding(
padding: const EdgeInsets.only(
left: 16, top: 16, bottom: 16),
child: Row(
children: [
Expanded(
child: Text(
articleData["title"]["rendered"]
.replaceAll("’", "'")
.replaceAll("<p>", "")
.replaceAll("</p>", ""),
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w600,
fontFamily: "Raleway",
),
overflow: TextOverflow.ellipsis,
maxLines: 2,
//softWrap: false,
),
),
],
),
)
],
),
],
),
),
onTap: () {
favoriteArticles.addFavorite(
id: articleData['id'],
urlImage: articleData['_embedded']['wp:featuredmedia'][0]['source_url'],
title: articleData['title']['rendered'],
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
ArticlePage(
data: articleData,
),
),
);
},
),
);
},
);
} else {
return const EmptyArticle();
}
},
);
} else {
return const CircularProgressIndicator();
}
},
),
);
}
}
这是文章页面,用户可以点击并保存文章
class _ArticlePageState extends State<ArticlePage> {
final id; final urlImage; final title; final description; final data;
_ArticlePageState(this.data, this.id, this.urlImage, this.title, this.description);
/// Save article
late FavoriteArticles _favoriteArticles;
late bool _favoriteArticlesReady = false;
late bool isFavorite = false;
@override
void initState() {
_favoriteArticles = Provider.of<FavoriteArticles>(context, listen: false,);
setState(() {
isFavorite = true;
_favoriteArticlesReady = true;
isFavorite = _favoriteArticles.isFavorite(widget.id);
});
super.initState();
}
@override
void didChangeDependencies() {
_favoriteArticles = Provider.of<FavoriteArticles>(context, listen: false,);
setState(() {
isFavorite = true;
_favoriteArticlesReady = true;
isFavorite = _favoriteArticles.isFavorite(widget.id);
});
super.didChangeDependencies();
}
/// Function saved and remove article
Future<void> _savedArticle() async {
_favoriteArticles = Provider.of<FavoriteArticles>(context, listen: false);
if (_favoriteArticles.isFavorite(id)) {
_favoriteArticles.removeFavorite(id);
setState(() {
isFavorite = false;
});
print("Remove article");
} else {
setState(() {
isFavorite = true;
_favoriteArticles.addFavorite(
id: id,
urlImage: urlImage,
title: title,
);
});
print("Saved article "
"ID article $id "
"${data["_embedded"]["wp:featuredmedia"][0]["link"]} " // Image
"Article link "
"${data["link"]}" // Link
"${data["title"]["rendered"].toString().replaceAll("<p>", "").replaceAll("’", "'").replaceAll("</p>", "")}", // Title
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
leading: Builder(
builder: (BuildContext context) {
return GestureDetector(
child: Center(
child: Container(
color: Colors.white70.withOpacity(0),
child: Container(
height: 30,
width: 30,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
'assets/images/previous.png',
),
),
),
),
),
),
onTap: () {
Navigator.of(context).pop();
},
);
},
),
flexibleSpace: FlexibleSpaceBar(
centerTitle: true,
background: CachedNetworkImage(
imageUrl: data["_embedded"]["wp:featuredmedia"][0]["link"],
//articleModel.urlImage!,
fit: BoxFit.cover,
placeholder: (context, url) => Image.asset("assets/gif/shimmer.gif", fit: BoxFit.cover,),
errorWidget: (context, url, error) => Image.asset("assets/images/unloadedImage.png", width: 250, height: 250),
),
),
actions: [
/// Favorite icon
Padding(
padding: const EdgeInsets.only(right: 10.0),
child: Container(
margin: const EdgeInsets.only(top: 12.0, bottom: 10.0),
width: 35,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: Colors.white,
),
child: IconButton(
icon: isFavorite ? const Icon(Icons.bookmark_outlined, color: Color(0xFF0D47A1), size: 18,)
: const Icon(Icons.bookmark_outline_outlined, color: Color(0xFF0D47A1), size: 18,),
onPressed: () async {
setState(() {
isFavorite = !isFavorite;
});
await _savedArticle();
},
),
),
),
/// Share article icon
Padding(
padding: const EdgeInsets.only(right:15.0),
child: IconButton(
icon: Image.asset('assets/images/share_icon.png',),
onPressed: () {
Share.share(data["link"], subject: "Leggi l'articolo di AssoFacile News $title");
},
),
),
],
floating: true,
expandedHeight: 320,
),
SliverList(
delegate: SliverChildListDelegate([
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
const SizedBox(height: 20,),
Container(
padding: const EdgeInsets.all(16),
child:
Text(data["title"]["rendered"]
.toString()
.replaceAll("<p>", "")
.replaceAll("’", "'")
.replaceAll("</p>", ""),
style: const TextStyle(
fontWeight: FontWeight.w600,
fontSize: 20,
fontFamily: "Raleway",
),
),
),
const SizedBox(height: 0),
Container(
padding: const EdgeInsets.all(16),
child: HtmlWidget(
data['content']['rendered'].toString().replaceAll("<p>", "").replaceAll("’", "'").replaceAll("</p>", ""),
),
),
const SizedBox(height: 20),
],
),
],
),
),
],
),
);
}
}