【问题标题】:Why my Flutter JSON data didn't updated from setState?为什么我的 Flutter JSON 数据没有从 setState 更新?
【发布时间】:2021-04-11 01:38:58
【问题描述】:

我已经制作了 JSON 数据,并使用 ListView.builder 小部件将其显示在 FutureBuilder 中。我想在 ListView.builder 的尾部创建一个喜欢的图标。所以我用 IconButton 创建了它,但是当我创建 setState 以将某些项目设为收藏时,数据没有更新。

这是我的代码

import 'package:flutter/material.dart';
import 'package:json_test/class/doa.dart';
import 'package:json_test/page/DoaPage.dart';

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  Future<List<Doa>> fetchDoa(BuildContext context) async {
    final jsonstring =
        await DefaultAssetBundle.of(context).loadString('assets/doa.json');
    return doaFromJson(jsonstring);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("JSON Data test"),
        ),
        body: Container(
            child: FutureBuilder(
                future: fetchDoa(context),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    return ListView.builder(
                      itemCount: snapshot.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        Doa doa = snapshot.data[index];
                        return Card(
                            margin: EdgeInsets.all(8),
                            child: ListTile(
                                title: Text(doa.judul),
                                onTap: () {
                                  Navigator.of(context).push(MaterialPageRoute(
                                      builder: (BuildContext context) =>
                                          DoaPage(
                                            doa: doa,
                                          )));
                                },
                                trailing: IconButton(
                                  icon: Icon(
                                    doa.fav
                                        ? Icons.favorite
                                        : Icons.favorite_border,
                                    color: doa.fav ? Colors.red : null,
                                  ),
                                  onPressed: () =>
                                      setState(() => doa.fav = !doa.fav),
                                )));
                      },
                    );
                  }
                  return CircularProgressIndicator();
                })));
  }
}

这就是 preview

【问题讨论】:

    标签: flutter icons favorites


    【解决方案1】:

    问题是,当您调用 setState 时,您会再次运行 build,然后又会使用原始 Doa 对象再次运行 FutureBuilder。

    您需要在 build 方法之外保留一个变量来保存 _MainPageState 中的更改,有几种方法可以做到这一点,在您的情况下它有点复杂,因为您需要 fetchDoa 中的上下文。

    一种解决方法是创建一个 doaList 变量以在构建之外保存获取的数据,并更改 fetchDoa 函数以设置 doaList 而不是返回它(这就是它现在是 Future 的原因。 但这还不够,因为 FutureBuilder 只会在每次构建运行时从头开始设置 doaList,所以我们将添加一个 _isInit bool 来检查它是否是第一次运行构建。 之后,您应该将所有 'snapshot.data' 替换为 doaList,因为快照不包含任何内容

      class _MainPageState extends State<MainPage> {
      List<Doa> doaList;
      bool _isInit = true; 
    
      Future<void> fetchDoa(BuildContext context) async {
        final jsonstring =
            await DefaultAssetBundle.of(context).loadString('assets/doa.json');
        doaList = doaFromJson(jsonstring);
        _isInit = false;
      }
    
      @override
       Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text("JSON Data test"),
             ),
            body: Container(
                child: FutureBuilder(
                    future: _isInit? fetchDoa(context): Future(),
                    builder: (context, _) {
                  
    

    试试这个,告诉我它是否有效:)

    【讨论】:

    • 嗯,对不起,因为我还是 Flutter 的新手。你对我在 Flutter 应用程序中存储数据有什么建议吗?因为如果我点击这个应用程序中的爱图标,在我关闭并再次打开应用程序后,收藏的数据将丢失:(
    • 当然!如果您想将其保存在设备外,因此当您关闭应用程序并再次打开它时,您仍将保持您的状态(Love 图标将保持收藏状态),您需要将数据存储在您的设备上或使用类似的数据库火力基地。如果您将其存储在您的设备上并从另一台设备登录,您当然会丢失数据。因为这是一个很长的解释,我不能在这个评论中做。尝试阅读 SharedPrefrences 包Firebase
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多