Flutter地图模型管理插件map_model的使用
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
更多关于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应用中显示它们。希望这对你有所帮助!