mydomain
No ADS
No ADS

FlutterArtist Scalar External Shelf Event ex1

  1. Cấu trúc của ví dụ
  2. SystemReport24aShelf
  3. SystemReport24aScalar
  4. SystemReport24aButtons
Để đơn giản hãy xem xét hình minh hoạ dưới đây:
Khi bạn cố gắng thêm, xoá hoặc sửa đổi một ItemA1 trên BlockA1 (Của ShelfA), một sự kiện sẽ được phát ra bên ngoài ShelfA và gửi tới ShelfB. Giả sử rằng ScalarB1 đã nghe được sự kiện này. Phản ứng ở mức SCALAR (Scalar-level) của ScalarB1 có thể là truy vấn lại.
Chú ý: Bạn nên xem một ví dụ cơ bản về Scalar trong bài viết dưới đây trước khi tiếp tục với bài viết này:
  • FlutterArtist SingleItemBlock ex1 (***)
Kịch bản của ví dụ:
Trong ví dụ này, SystemReport24aScalar được cấu hình "phản ứng ở mức SCALAR với các sự kiện bên ngoài Shelf". Từ màn hình SystemReport24aScalar bạn gọi tới Form của SingleSupplierBlock thuộc một Shelf khác để tạo hoặc sửa đổi một Supplier. Sau khi tạo hoặc sửa đổi thành công một sự kiện sẽ được phát ra tại SingleSupplierBlock và gây ra phản ứng ở mức SCALAR (Scalar-level) tại SystemReport24aScalar kích hoạt việc truy vấn lại Scalar này.
Scalar Value
{
   "categoryCount": 3,
   "employeeCount": 20,
   "noteCount": 8,
   "productCount": 31,
   "supplierCount": 4,
   "saleOrderCount": 304
}
No ADS

1. Cấu trúc của ví dụ

2. SystemReport24aShelf

Thuộc tính ScalarConfig.onExternalShelfEvents được sử dụng để định nghĩa cách mà Scalar này phản ứng với một sự kiện xẩy ra bên ngoài Shelf.
  • scalarLevelReactionOn: Định nghĩa các sự kiện nào sẽ làm cho Scalar này phản ứng ở mức Scalar, hay nói cách khác là nó sẽ được truy vấn lại (re-query).
No ADS
system_report24a_shelf.dart
class SystemReport24aShelf extends Shelf {
  @override
  ShelfStructure defineShelfStructure() {
    return ShelfStructure(
      filterModels: {},
      blocks: [],
      scalars: [
        SystemReport24aScalar(
          name: SystemReport24aScalar.scalarName,
          description: null,
          filterModelName: null,
          config: ScalarConfig(
            onExternalShelfEvents: ExternalShelfEventScalarRecipient(
              scalarLevelReactionOn: [
                Event(SupplierInfo), //
                Event(SupplierData), //
              ],
            ),
          ),
        ),
      ],
    );
  }

  SystemReport24aScalar findSystemReport24aScalar() {
    return findScalar(SystemReport24aScalar.scalarName)
        as SystemReport24aScalar;
  }
}
  • FlutterArtist Projections (***)

3. SystemReport24aScalar

system_report24a_scalar.dart
class SystemReport24aScalar extends Scalar<
    SystemReportData, // VALUE
    EmptyFilterInput,
    EmptyFilterCriteria> {
  static const scalarName = "system-report24a-scalar";

  final systemReportRestProvider = SystemReportRestProvider();

  SystemReport24aScalar({
    required super.name,
    required super.description,
    required super.config,
    required super.filterModelName,
  }) : super(childScalars: const []);

  @override
  Future<ApiResult<SystemReportData>> performQuery({
    required Object? parentScalarValue,
    required EmptyFilterCriteria filterCriteria,
  }) async {
    return await systemReportRestProvider.query();
  }
}

4. SystemReport24aButtons

system_report24a_buttons.dart
class SystemReport24aButtons extends ScalarSectionView<SystemReport24aScalar> {
  const SystemReport24aButtons({super.key, required super.scalar});

  @override
  Widget buildContent(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        ElevatedButton(
          onPressed: () {
            _onPressCreateSupplierBtn(context);
          },
          child: Text("Create Supplier"),
        ),
      ],
    );
  }

  Future<void> _onPressCreateSupplierBtn(BuildContext context) async {
    FlutterArtist.codeFlowLogger.addMethodCall(
      ownerClassInstance: this,
      currentStackTrace: StackTrace.current,
      parameters: null,
    );
    //
    Coordinator coordinator = SingleSupplierCreationCoordinator(
      config: CoordinatorConfig(),
      customNavigate: (BuildContext context, bool success) {
        if (success) {
          Scaffold.of(context).openEndDrawer();
        }
      },
    );
    await coordinator.execute(context);
  }
}
No ADS
No ADS