簡體   English   中英

在 Dart 中傳遞一個 class 作為方法參數

[英]Pass a class as method parameter in Dart

假設這個 class:

class SimpleRectPaint extends Object {

  static CustomPaint build( ParamsBundle paramBundle ) {
     return CustomPaint(
         painter: SimpleRectPainter( paramBundle: paramBundle ),
         child: Container(width: paramBundle.width, height: paramBundle.height)
     );
  }

}

我想通過ClassReference參數someClass抽象 class SimpleRectPaint並使該方法更通用。 不幸的是,這不是有效的代碼:

class SimpleRectPaint extends Object {

  static CustomPaint build( ParamsBundle paramBundle, ClassReference someClass ) {
     return CustomPaint(
         painter: someClass( paramBundle: paramBundle ),
         child: Container(width: paramBundle.width, height: paramBundle.height)
     );
  }

}

問:我該如何寫呢?

在此處輸入圖像描述

您可以通過傳遞CustomPainterCreator來做到這一點:

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      title: 'Generic Painter',
      home: Scaffold(
        body: MyWidget(),
      ),
    ),
  );
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: SizedBox(
        width: 200,
        height: 200,
        child: Stack(
          fit: StackFit.expand,
          children: [
            Background(),
            MyPainter(creator: RectPainter.creator, color: Color(0xFF104C91)),
            MyPainter(creator: OvalPainter.creator, color: Color(0xFF1F8AC0)),
          ],
        ),
      ),
    );
  }
}

class Background extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        color: Color(0xFFEFC9AF),
        border: Border.all(width: 3.0),
        borderRadius: BorderRadius.all(Radius.circular(10.0)),
      ),
    );
  }
}

typedef CustomPainterCreator(Color color);

class MyPainter extends StatelessWidget {
  final CustomPainterCreator creator;
  final Color color;

  const MyPainter({
    Key key,
    this.creator,
    this.color,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: creator(color),
    );
  }
}

class OvalPainter extends CustomPainter {
  static CustomPainterCreator creator = (color) => OvalPainter(color: color);

  final Color color;

  OvalPainter({this.color = Colors.green});

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()..color = color;
    canvas.drawOval(
      Rect.fromLTWH(size.width * .4, size.height * .15, size.width * .5,
          size.height * .5),
      paint,
    );
  }

  @override
  bool shouldRepaint(OvalPainter oldDelegate) => false;
}

class RectPainter extends CustomPainter {
  static CustomPainterCreator creator = (color) => RectPainter(color: color);

  final Color color;

  RectPainter({this.color = Colors.indigo});

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()..color = color;
    canvas.drawRRect(
      RRect.fromRectAndRadius(
          Rect.fromLTWH(size.width * .15, size.height * .25, size.width * .6,
              size.height * .6),
          Radius.circular(20)),
      paint,
    );
  }

  @override
  bool shouldRepaint(RectPainter oldDelegate) => false;
}

但是,雖然這個練習很有趣……為什么?

代替:

MyPainter(creator: RectPainter.creator, color: Color(0xFF104C91)),

你可以這樣做:

CustomPaint(painter: RectPainter(color: Color(0xFF104C91))),

如果不是,那么需要更多抽象的具體需求是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM