使用Flutter/Dart和GetX的应用程序:生成器不会使用数据库中的新值更新自身

lymnna71  于 2023-05-08  发布在  Flutter
关注(0)|答案(1)|浏览(131)

我用Flutter/Dart和GetX框架编写了一个应用程序。在主屏幕上,数据库(ISAR DB)中的内容应以卡片小部件的形式显示。如果您在HomeScreen中单击FAB,则会在新屏幕中加载一个表单,您可以在其中输出新CardWidget的数据。我现在的问题是,当我在模拟器中重新启动应用程序时,就像在真实的设备上一样,没有记录(即。没有卡)显示-如果我改变屏幕并返回或在模拟器中执行热刷新,则显示卡。创建新数据库条目时显示相同的行为:如果返回主屏幕,则只有在屏幕更改或热刷新后,新条目才会显示在主屏幕上。
从这个行为中,我假设HomeScreen没有提供更新的数据--尽管我实际上已经考虑到了这一点,正如下面的代码所示。也许有人可以帮我解决这个问题。我假设从这个行为中,主屏幕没有提供更新的数据-虽然我实际上已经考虑到这一点,因为下面的代码应该显示。也许有人能帮我。
home_screen.dart:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

[imports of widgets]
import '../../controllers/home_screen_controller.dart';

class HomeScreen extends StatelessWidget {
  HomeScreen({Key? key}) : super(key: key);

  final HomeScreenController homeScreenController = Get.put(HomeScreenController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CxdAppbar(title: 'appbar_01'.tr),
      drawer: const NavDrawer(),
      body: GetBuilder<HomeScreenController>(
        builder: (homeScreenController) {
          if (homeScreenController.isLoading.value) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          } else {
            final allCardEntitys = homeScreenController.allCardEntitys;

            return ListView.builder(
              itemCount: allCardEntitys.length,
              itemBuilder: (context, index) {
                return CxdCardWidget1(
                  id: allCardEntitys[index].id,
                  title: allCardEntitys[index].title,
                  tsCd: allCardEntitys[index].tsCd,
                  imageBytes: allCardEntitys[index].imageBytes ?? [],
                  bgColor: Color(allCardEntitys[index].bgColor),
                  fontColor: Color(allCardEntitys[index].fontColor),
                  dividerColor: Color(allCardEntitys[index].dividerColor),
                  borderColor: Color(allCardEntitys[index].borderColor),
                );
              },
            );
          }
        },
      ),
      floatingActionButton: const CxdFloatingActionButton(),
    );
  }
}

home_screen_controller.dart:

import 'package:get/get.dart';

import '../services/entities/card_entity.dart';
import '../services/isar_service.dart';

class HomeScreenController extends GetxController {
  IsarService isarService = IsarService();

  RxList<CardEntity> allCardEntitys = RxList([]);

  RxBool isLoading = true.obs;

  Future<void> getAllCardEntitys() async {
    try {
      isLoading.value = true;
      final cardEntitys = await isarService.getAllCardEntitys();
      allCardEntitys.assignAll(cardEntitys);
    } finally {
      isLoading.value = false;
    }
  }

  @override
  void onInit() {
    super.onInit();
    getAllCardEntitys();
  }
}
6ss1mwsb

6ss1mwsb1#

当您使用GetBuilder从控制器手动更新小部件的状态时,必须使用update()。
在你的情况下,就像这样使用它:

Future<void> getAllCardEntitys() async {
try {
  isLoading.value = true;
  final cardEntitys = await isarService.getAllCardEntitys();
  allCardEntitys.assignAll(cardEntitys);
  update();
} finally {
  isLoading.value = false;
}}

相关问题