dart 当从navigator.pop调用setState并带有参数时,Flutter父级不会呈现

velaa5lx  于 2023-04-09  发布在  Flutter
关注(0)|答案(2)|浏览(115)

我有一个家长小程序里面有一个代理机构的案件列表。
父级获取数据作为future,并将其传递给正在构建列表小部件的future构建器。
浮动操作按钮导航到一个新页面以创建一个新案例并将其保存到数据库,当我navigator.pop带有我想要的参数时,因此重新加载父级。但重建不会在父级中发生。
当按下专用刷新按钮时,它正在工作。
我可以从update函数中的print语句中看到,它总是被触发,但重建只是在使用刷新按钮时发生。

...

class _CasesPageState extends State<CasesPage> {
  IsarHelper db = IsarHelper();
  late Future<List<Case>> cases;

  @override
  void initState() {
    super.initState();
    cases = _getCases();
  }

  Future<List<Case>> _getCases() async {
    return await db.getCases();
  }

  _updateCases() async {
    setState(() {
      print("setState");
      cases = _getCases();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(title: "Cases"),
      drawer: const AppDrawer(),
      body: Padding(
        padding: const EdgeInsets.fromLTRB(4.0, 4.0, 4.0, 0.0),
        child: Column(
          children: [
            Expanded(
                flex: 1,
                child: ElevatedButton(
                  onPressed: () {
                    _updateCases(); // rebuild wihtout problems
                  },
                  child: const Text("refresh"),
                )),
            Expanded(
              flex: 11,
              child: FutureBuilder<List<Case>>(
                  future: cases,
                  builder: (BuildContext context, snapshot) {
                    if (snapshot.hasData) {
                      return CaseList(
                        cases: snapshot.data!,
                      );
                    }
                    return const Text("waiting");
                  }),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final popMsg = await Navigator.pushNamed(
            context,
            NewCasePage.routeName,
          );
          if (popMsg == "new") _updateCases(); // triggers function but does not rebuild
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}

用于创建新案例的小部件执行弹出操作:

...
Navigator.pop(context, "new");
...

也许有人能启发我?

jjhzyzn0

jjhzyzn01#

在你的_updateCases方法中尝试这些东西。

_updateCases() async {
    cases = await _getCases();
    setState(() {
      print("setState");
      
    });
  }
e5njpo68

e5njpo682#

好了,解决了,我把这个放在这里,作为对其他新手开发人员的警告。

经验教训:始终等待数据库操作,不要期望它们立即发生或忘记等待它们。

最后的修正非常简单:只需添加一个await,这样在弹出路由时就完成了db操作。

...
await db.createNewCase(newCase);
Navigator.pop(context, "new");
...

相关问题