Customise google map marker with text in it

Hi,
What I would like to achieve is customise map marker with some dynamic text in it. I have attached the sample image as reference of what I would like to achieve.


So I have been struggling trying to achieve then I found something close to my problem. The codes below is that I am trying to call.

First what I did this is this codes. Off course I just ran this code which is with the static image and no room to add any extra text etc.

BitmapDescriptor.fromAssetImage(
                    ImageConfiguration(size: Size(48, 48)), 'lib/assets/grey.png')
                    .then((onValue) {
                      print("CHECKKKKKK");
                  iconMoving = onValue;
                  final marker = Marker(
                    markerId: markerId,
                    position: LatLng(lat, lng),
                    infoWindow: InfoWindow(title: plateNumber, snippet: ''),
                    icon: iconMoving,
                    onTap: () {
                      _onMarkerTapped(info);
                    },
                  );
                  markers.add(marker);
                    }
        );

Then I have the following codes. The issue is the following codes works with no error but eventually I dont see the icon being generated. So its like empty nothing on the map. What could be the issue or error and how can I achieve the final output as my image.

getMarkerIcon('lib/assets/grey.png',Size(150.0, 150.0)).then((onValue){
                  //∂print("CHECKKKKKK");
                  iconMoving = onValue;
                  print("Onvalue "+iconMoving.toString());
                  final marker = Marker(
                    markerId: markerId,
                    position: LatLng(lat, lng),
                    infoWindow: InfoWindow(title: plateNumber, snippet: ''),
                    icon: iconMoving,
                    onTap: () {
                      _onMarkerTapped(info);
                    },
                  );
                  markers.add(marker);
          }
        );

Future<BitmapDescriptor> getMarkerIcon(String imagePath, Size size) async {
    
    final ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
    final Canvas canvas = Canvas(pictureRecorder);
    
    final Radius radius = Radius.circular(size.width / 2);

    final Paint tagPaint = Paint()..color = Colors.blue;
    final double tagWidth = 40.0;

    final Paint shadowPaint = Paint()..color = Colors.blue.withAlpha(100);
    final double shadowWidth = 15.0;

    final Paint borderPaint = Paint()..color = Colors.white;
    final double borderWidth = 3.0;

    final double imageOffset = shadowWidth + borderWidth;

    // Add shadow circle
    canvas.drawRRect(
        RRect.fromRectAndCorners(
          Rect.fromLTWH(
              0.0,
              0.0,
              size.width,
              size.height
          ),
          topLeft: radius,
          topRight: radius,
          bottomLeft: radius,
          bottomRight: radius,
        ),
        shadowPaint);

    // Add border circle
    canvas.drawRRect(
        RRect.fromRectAndCorners(
          Rect.fromLTWH(
              shadowWidth,
              shadowWidth,
              size.width - (shadowWidth * 2),
              size.height - (shadowWidth * 2)
          ),
          topLeft: radius,
          topRight: radius,
          bottomLeft: radius,
          bottomRight: radius,
        ),
        borderPaint);
    
    // Add tag circle
    canvas.drawRRect(
        RRect.fromRectAndCorners(
          Rect.fromLTWH(
              size.width - tagWidth,
              0.0,
              tagWidth,
              tagWidth
          ),
          topLeft: radius,
          topRight: radius,
          bottomLeft: radius,
          bottomRight: radius,
        ),
        tagPaint);
    
    // Add tag text
    TextPainter textPainter = TextPainter(textDirection: TextDirection.ltr);
    textPainter.text = TextSpan(
      text: '111',
      style: TextStyle(fontSize: 20.0, color: Colors.white),
    );
     
    textPainter.layout();
    textPainter.paint(
        canvas,
        Offset(
            size.width - tagWidth / 2 - textPainter.width / 2,
            tagWidth / 2 - textPainter.height / 2
        )
    );
   
    // Oval for the image
    Rect oval = Rect.fromLTWH(
        imageOffset,
        imageOffset,
        size.width - (imageOffset * 2),
        size.height - (imageOffset * 2)
    );

    // Add path for oval image
    canvas.clipPath(Path()
      ..addOval(oval));
    
    // Add image
    ui.Image image = await getImageFromPath(imagePath); // Alternatively use your own method to get the image
    print("GET MARKER ICON CUSTOMISE CALLED"+image.height.toString());
    paintImage(canvas: canvas, image: image, rect: oval, fit: BoxFit.fitWidth);
     
    // Convert canvas to image
    final ui.Image markerAsImage = await pictureRecorder.endRecording().toImage(
        size.width.toInt(),
        size.height.toInt()
    );

    // Convert image to bytes
    final ByteData byteData = await markerAsImage.toByteData(format: ui.ImageByteFormat.png);
    final Uint8List uint8List = byteData.buffer.asUint8List();

    return BitmapDescriptor.fromBytes(uint8List);
  }

  Future<ui.Image> getImageFromPath(String imagePath) async {
    
    //String fullPathOfImage = await getFileData(imagePath);
    
    //File imageFile = File(fullPathOfImage);
    ByteData bytes = await rootBundle.load(imagePath);
    Uint8List imageBytes = bytes.buffer.asUint8List();
    //Uint8List imageBytes = imageFile.readAsBytesSync();

    final Completer<ui.Image> completer = new Completer();

    ui.decodeImageFromList(imageBytes, (ui.Image img) {
      return completer.complete(img);
    });
    //print("COMPLETERR DONE Full path of image is"+imagePath);
    return completer.future;
  }