如何在使用pop时在initState()flutter中重新加载数据

yv5phkfx  于 2022-12-27  发布在  Flutter
关注(0)|答案(2)|浏览(311)

我有两个屏幕,第一个从数据库中获取数据并显示在屏幕上。第二个屏幕创建一个新的用户/课程并将其发送到数据库。但当我使用弹出窗口返回到第一个屏幕时,我想更新其数据。我该如何做呢?
从第二个屏幕返回时,如何更新屏幕数据?
第一次筛选:

class CourseList extends StatefulWidget {
  const CourseList({super.key});

  @override
  State<CourseList> createState() => _CourseListState();
}

class _CourseListState extends State<CourseList> {
  Future<List<Course>?> listCourses = Future.value([]);
  @override
  initState() {
    super.initState();
    Future.delayed(Duration.zero, () {
      setState(() {
        var course = CoursesData();
        listCourses = course.getCourses();
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    var futureBuilder = FutureBuilder(
        future: listCourses,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData) {
            return createScreen(context, snapshot);
          } else if (snapshot.hasError) {
            return Text("${snapshot.error}");
          }
          return const Center(child: CircularProgressIndicator());
        });

    return futureBuilder;
  }

 Widget createScreen(BuildContext context, AsyncSnapshot snapshot) {
    return Column(
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
                onPressed: () {
                  Navigator.of(context)
                      .pushNamed('/courseForm', arguments: null);
                },
                child: const Text("Adicionar Curso"))
          ],
        ),
        Expanded(
            child: ListView.builder(
          shrinkWrap: true,
          itemCount: snapshot.data.length,
          itemBuilder: ((context, index) {
            return CourseTile(snapshot.data[index]);
          }),
        ))
      ],
    );
  }
}

第二屏:

IconButton(
              onPressed: () {
                final isValid = _fomr.currentState!.validate();

                Navigator.pop(context, true);
                
              },
              icon: const Icon(Icons.save))

zrfyljdw

zrfyljdw1#

您可以导航到第二个屏幕,如下所示:

var result = await Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondScreen()));

if(result != null && result){
   setState(() {
        var course = CoursesData();
        listCourses = course.getCourses();
   });
}

然后在第二个屏幕上像这样弹出

Navigator.pop(context, true);

正如你现在所做的,你传递回一个bool变量到第一个屏幕,它就像一个标志,你可以找到什么时候是重新加载数据的时间。也不要忘记await为导航器,因为你可以从你的第二个屏幕接收数据。现在,当你从第二个屏幕回来,它会更新用户界面。

oogrdqng

oogrdqng2#

The documentation详细介绍了这个例子,所以我将粘贴相关部分:

Future<void> _navigateAndDisplaySelection(BuildContext context) async {
  // Navigator.push returns a Future that completes after calling
  // Navigator.pop on the Selection Screen.
  final result = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => const SelectionScreen()),
  );

关键就在这一行:

final result = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => const SelectionScreen()),
  );

navigator.push的结果将存储在result中。
因此,在您的情况下,您应该在得到结果后执行此操作(因为@eamirho3ein已先回答,所以我在解释):

setState(() {
        var course = CoursesData();
        listCourses = course.getCourses();
   });

相关问题