Flutter地图模型管理插件map_model的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter 地图模型管理插件 map_model 的使用

Dart flutter Pub 包

语言: 英文 中文

MapModel 顾名思义。使用 Map 实现各种模型对象,如实体(Entity)、值对象(VO)和数据传输对象(DTO)。

其核心思想是使用 Map 作为存储,并通过 getter 和 setter 作为外观模式来控制可见性。为了减少对象转换的成本,甚至共享同一个实例,只是具有不同的可见性。这就像使用不同类型的指针来解释同一内存空间,而不是在多个内存块之间维护数据同步。

安装

dependencies:
  map_model: any

dev_dependencies:
  build_runner: any
  map_model_builder: any

示例

import 'package:map_model/map_model.dart';

part 'your_model.g.dart';

@Model([
  Property<String?>('nullableString', value: '"123"'), // 可空字符串,默认值为 "123"
  Property<int>('fixInt'), // 固定整数
  Property('notType', value: '12'), // 无类型,默认值为 12
  Property<List<String>?>('listWithType'), // 带类型的列表
  Property<List?>('listNoType'), // 无类型的列表
  Property<Map<String?, dynamic>?>('mapWithType'), // 带类型的映射
  Property<Map?>('mapNoType'), // 无类型的映射
  Property<DateTime?>('dateTime'), // 日期时间
], converts: {
  List<String?>: 'toStringList', // 自定义转换函数
})
class SuperModel extends _SuperModelImpl {
  /// 使用继承
  SuperModel([super.data]);
}

@Model([
  Property<String?>('subProperty', value: '"value form sub default"'), // 子属性,默认值为 "value form sub default"
])
class SubModel extends SuperModel with _SubModelMixin {
  /// 使用混入
  SubModel([super.data]);
}

// 自定义转换函数
List<String> toStringList(String property, dynamic value) {
  return value.split(' ');
}
  • @Model.converts 定义类型转换,参见默认支持的类型:List
  • 使用继承:_${yourClass}Impl
  • 使用混入:_${yourClass}Mixin

生成

flutter pub run build_runner build

或者

dart run build_runner build

使用 MapModel

/// 简单用例
var customModel = SuperModel();
print(customModel.nullableString);

/// 控制台输出 '123'

/// 初始化数据
Map<String, dynamic> data = {
  'nullableString': 'notDefaultValue', // 可空字符串的默认值不是 "123"
  'unknownProperty': 'do not export', // 不导出未知属性
  'listWithType': 'a b c', // 自动转换,List<String> 默认分隔符是 ' '
  'dateTime': '2023-05-19' // 自动转换,DateTime 接受 String 和 int
};
var customModelWithInit = SuperModel(data);
print(customModelWithInit.nullableString);

/// 控制台输出 'notDefaultValue'

var subModel = SubModel(data);
print(subModel.$export());

/// 不导出 'unknownProperty'
/// 控制台输出 {nullableString: notDefaultValue, fixInt: null, notType: 12, listWithType: [a, b, c], listNoType: null, mapWithType: null, mapNoType: null, dateTime: 2023-05-19 00:00:00.000, subProperty: value form sub default}

var other = SuperModel();
subModel.$bindTo(other);

/// 不同类型获得了同步数据的能力
/// 改变其中一个绑定,另一个也会改变
subModel.nullableString = 'from bind changed';

print(other.nullableString);

/// 控制台输出 'from bind changed'

更多关于Flutter地图模型管理插件map_model的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图模型管理插件map_model的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用map_model插件来管理地图模型的示例代码。假设你已经添加了map_model依赖到你的pubspec.yaml文件中,并且已经运行了flutter pub get

1. 添加依赖

首先,确保你的pubspec.yaml文件中包含以下依赖:

dependencies:
  flutter:
    sdk: flutter
  map_model: ^最新版本号  # 请替换为实际的最新版本号

2. 导入插件

在你的Dart文件中导入map_model插件:

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

3. 初始化地图模型

创建一个地图模型并初始化一些数据,例如标记(markers)、多边形(polygons)等。

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Map Model Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MapModelExample(),
    );
  }
}

class MapModelExample extends StatefulWidget {
  @override
  _MapModelExampleState createState() => _MapModelExampleState();
}

class _MapModelExampleState extends State<MapModelExample> {
  late MapModelController _mapModelController;

  @override
  void initState() {
    super.initState();
    // 初始化MapModelController
    _mapModelController = MapModelController()
      ..addMarker(
        MarkerModel(
          id: 'marker1',
          latitude: 37.7749,
          longitude: -122.4194,
          title: 'San Francisco',
        ),
      )
      ..addPolygon(
        PolygonModel(
          id: 'polygon1',
          points: [
            LatLngModel(latitude: 37.7749, longitude: -122.4194),
            LatLngModel(latitude: 37.7789, longitude: -122.4194),
            LatLngModel(latitude: 37.7789, longitude: -122.4294),
            LatLngModel(latitude: 37.7749, longitude: -122.4294),
          ],
        ),
      );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Model Example'),
      ),
      body: MapModelWidget(
        controller: _mapModelController,
        apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 请替换为你的Google Maps API Key
        initialCameraPosition: CameraPosition(
          target: LatLng(37.7749, -122.4194),
          zoom: 12.0,
        ),
      ),
    );
  }
}

4. 显示地图

使用MapModelWidget来显示地图,并将MapModelController传递给它。确保你替换了YOUR_GOOGLE_MAPS_API_KEY为你的实际Google Maps API Key。

5. 运行项目

确保你的设备或模拟器已经连接,然后运行你的Flutter项目:

flutter run

注意

  • map_model插件的具体API可能会根据版本有所变化,请参考官方文档或源代码以获取最新信息。
  • 确保你已经正确设置了Google Maps API,并在Google Cloud Console中启用了相应的API服务。
  • 标记和多边形的添加只是示例,你可以根据实际需求动态添加或修改地图模型。

这段代码展示了如何使用map_model插件来管理地图上的标记和多边形,并在Flutter应用中显示它们。希望这对你有所帮助!

回到顶部