从 SharedPreferences 加载时出错:FormatException:无效的 radix-10 数字(在字符 1 处)

问题描述 投票:0回答:0

当用户点击以保存文章并将其传递到收藏夹页面时,我在尝试从文章中保存 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("&#8217;", "'")
                                                  .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("&#8217;", "'").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("&#8217;", "'")
                        .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("&#8217;", "'").replaceAll("</p>", ""),
                    ),
                  ),
                  const SizedBox(height: 20),
                ],
              ),
            ],
            ),
          ),
        ],
      ),
    );
  }
}
flutter sharedpreferences radix formatexception
© www.soinside.com 2019 - 2024. All rights reserved.