运行集成测试时 Flutter 冲突的依赖关系

问题描述 投票:0回答:1

我导入了两个具有相同名称的类的库。我试图通过在使用的项目中使用别名来解决冲突。我还尝试仅使用这两个导入创建一个小型空白项目,但我仍然无法运行集成测试。

这两个依赖项是

https://pub.dev/packages/google_maps_cluster_manager/example https://pub.dev/packages/google_maps_flutter/versions

我使用集群管理器中的示例代码制作了虚拟项目。

import 'dart:async';
import 'dart:ui';

import 'package:example/place.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_maps_cluster_manager/google_maps_cluster_manager.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Cluster Manager Demo',
      home: MapSample(),
    );
  }
}

// Clustering maps

class MapSample extends StatefulWidget {
  @override
  State<MapSample> createState() => MapSampleState();
}

class MapSampleState extends State<MapSample> {
  late ClusterManager _manager;

  Completer<GoogleMapController> _controller = Completer();

  Set<Marker> markers = Set();

  final CameraPosition _parisCameraPosition =
      CameraPosition(target: LatLng(48.856613, 2.352222), zoom: 12.0);

  List<Place> items = [
    for (int i = 0; i < 10; i++)
      Place(
          name: 'Place $i',
          latLng: LatLng(48.848200 + i * 0.001, 2.319124 + i * 0.001)),
    for (int i = 0; i < 10; i++)
      Place(
          name: 'Restaurant $i',
          isClosed: i % 2 == 0,
          latLng: LatLng(48.858265 - i * 0.001, 2.350107 + i * 0.001)),
    for (int i = 0; i < 10; i++)
      Place(
          name: 'Bar $i',
          latLng: LatLng(48.858265 + i * 0.01, 2.350107 - i * 0.01)),
    for (int i = 0; i < 10; i++)
      Place(
          name: 'Hotel $i',
          latLng: LatLng(48.858265 - i * 0.1, 2.350107 - i * 0.01)),
    for (int i = 0; i < 10; i++)
      Place(
          name: 'Test $i',
          latLng: LatLng(66.160507 + i * 0.1, -153.369141 + i * 0.1)),
    for (int i = 0; i < 10; i++)
      Place(
          name: 'Test2 $i',
          latLng: LatLng(-36.848461 + i * 1, 169.763336 + i * 1)),
  ];

  @override
  void initState() {
    _manager = _initClusterManager();
    super.initState();
  }

  ClusterManager _initClusterManager() {
    return ClusterManager<Place>(items, _updateMarkers,
        markerBuilder: _markerBuilder);
  }

  void _updateMarkers(Set<Marker> markers) {
    print('Updated ${markers.length} markers');
    setState(() {
      this.markers = markers;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: GoogleMap(
          mapType: MapType.normal,
          initialCameraPosition: _parisCameraPosition,
          markers: markers,
          onMapCreated: (GoogleMapController controller) {
            _controller.complete(controller);
            _manager.setMapId(controller.mapId);
          },
          onCameraMove: _manager.onCameraMove,
          onCameraIdle: _manager.updateMap),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _manager.setItems(<Place>[
            for (int i = 0; i < 30; i++)
              Place(
                  name: 'New Place ${DateTime.now()} $i',
                  latLng: LatLng(48.858265 + i * 0.01, 2.350107))
          ]);
        },
        child: Icon(Icons.update),
      ),
    );
  }

  Future<Marker> Function(Cluster<Place>) get _markerBuilder =>
      (cluster) async {
        return Marker(
          markerId: MarkerId(cluster.getId()),
          position: cluster.location,
          onTap: () {
            print('---- $cluster');
            cluster.items.forEach((p) => print(p));
          },
          icon: await _getMarkerBitmap(cluster.isMultiple ? 125 : 75,
              text: cluster.isMultiple ? cluster.count.toString() : null),
        );
      };

  Future<BitmapDescriptor> _getMarkerBitmap(int size, {String? text}) async {
    if (kIsWeb) size = (size / 2).floor();

    final PictureRecorder pictureRecorder = PictureRecorder();
    final Canvas canvas = Canvas(pictureRecorder);
    final Paint paint1 = Paint()..color = Colors.orange;
    final Paint paint2 = Paint()..color = Colors.white;

    canvas.drawCircle(Offset(size / 2, size / 2), size / 2.0, paint1);
    canvas.drawCircle(Offset(size / 2, size / 2), size / 2.2, paint2);
    canvas.drawCircle(Offset(size / 2, size / 2), size / 2.8, paint1);

    if (text != null) {
      TextPainter painter = TextPainter(textDirection: TextDirection.ltr);
      painter.text = TextSpan(
        text: text,
        style: TextStyle(
            fontSize: size / 3,
            color: Colors.white,
            fontWeight: FontWeight.normal),
      );
      painter.layout();
      painter.paint(
        canvas,
        Offset(size / 2 - painter.width / 2, size / 2 - painter.height / 2),
      );
    }

    final img = await pictureRecorder.endRecording().toImage(size, size);
    final data = await img.toByteData(format: ImageByteFormat.png) as ByteData;

    return BitmapDescriptor.fromBytes(data.buffer.asUint8List());
  }
}
../../.pub-cache/hosted/pub.dev/google_maps_cluster_manager-3.1.0/lib/src/cluster_manager.dart:8:1: Error: 'Cluster' is imported from both 'package:google_maps_cluster_manager/src/cluster.dart' and 'package:google_maps_flutter_platform_interface/src/types/cluster.dart'.
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';

清理和重建缓存似乎也不起作用。有没有办法给这些依赖项起别名来阻止它们发生冲突?

我希望能够使用这两个库而不发生冲突。我尝试在使用依赖项的文件中使用别名,并隐藏导致冲突的“集群”。

flutter dart google-maps mobile
1个回答
0
投票

您可以为这两个包提供前缀

如您的错误所示,

Error: 'Cluster' is imported from both 'package:google_maps_cluster_manager/src/cluster.dart' and 'package:google_maps_flutter_platform_interface/src/types/cluster.dart'.
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'

这表明这两个包的名称都为

Cluster
,并且 Dart 不知道您要在项目中使用哪一个。

根据 Dart 文档,这称为“不明确导入”。

当引用在两个或多个导入库中声明的名称时,分析器会生成此诊断信息。

最常见的修复如下:

    如果不需要任何库,请删除它们的导入指令。如果您认为其他库中已经存在该接口库,只需删除该接口库即可,只需使用需要的即可。
  1. 如果该名称仍然由多个库定义,则为除您要使用该名称的一个库之外的所有库的导入指令添加一个
  2. hide

    子句。在这种情况下,您可以从接口包中隐藏

    Cluster
    ,以便可以从集群管理器包中使用它。如果您愿意,也可以反过来做:
    import 'package:google_maps_cluster_manager/google_maps_cluster_manager.dart';
    import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart' hide Cluster;
    

  3. 如果您必须能够引用多个类型,请向每个导入指令添加前缀 (
  4. as

    ),并使用适当的前缀限定引用:

    import 'package:google_maps_cluster_manager/google_maps_cluster_manager.dart' as gmaps_clusterer;
    import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart' as gmaps_interface;
    
    // Then you can use the `Cluster` from both packages by using dot notation.
    gmaps_clusterer.Cluster
    gmaps_interface.Cluster
    

    
    
  5. 这样,您的问题/错误应该得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.