Flutter安全地图功能插件safemap的使用

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

Flutter安全地图功能插件safemap的使用

Safemap

Safely get value with Type from JSON map. Will return null value when value was wrong.

Feature

  • 安全取值:可以从Map中连续使用[]操作符取值,任何错误取值都会返回null而不会报错。
  • 安全的嵌套Map:你可以轻松取出深度嵌套Map中的数据,因为即使对Value为null的SafeMap使用[]操作符,也只会返回一个新的SafeMap(null)对象。
  • 按类型取值:支持直接取出期望类型的数据,类型不正确就会返回null而不会报错。
  • 类似Js的空值判断:通过调用isEmpty()方法,空数组,空字典,空字符串或0都会返回true,帮助你快速判断空值。

Getting Started

示例代码

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

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    // source map
    Map map = {
      'id': 3,
      'tag': 'student',
      'info': {
        'name': 'Jerry',
      },
      'class': [
        {
          "name": 'class 1',
          'tag': '',
        },
        {},
      ],
    };
    SafeMap safeMap = SafeMap(map);

    // 取值,错误的类型会返回SafeMap(null)
    assert(safeMap['id'].value == 3);
    assert(safeMap['id'].string == null);

    // 错误的下标也会返回SafeMap(null)
    assert(safeMap['tag'].value == 'student');
    assert(safeMap['tag12345'].value == null);

    // 连续取值,可以一直安全取值,只会返回SafeMap(null).
    assert(safeMap['info']['name'].value == 'Jerry');
    assert(safeMap['a']['b']['b']['b']['b']['b'].value == null);

    // 取出数组,也可以通过数组下标继续取值
    assert(safeMap['class'].list.length == 2);
    assert(safeMap['class'][0]['name'].value == 'class 1');

    // {},[],0,'',null 都会被判断为空
    assert(safeMap['class'][0]['tag'].isEmpty());
    assert(safeMap['class'][1].isEmpty());

    // 越界也会返回SafeMap(null),判断isEmpty为true
    assert(safeMap['class'][2].isEmpty());

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: '断言结束,运行正常'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  const MyHomePage({Key key, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(title),
      ),
    );
  }
}

解释

  1. 导入包

    import 'package:safemap/safemap.dart';
    
  2. 创建源Map

    Map map = {
      'id': 3,
      'tag': 'student',
      'info': {
        'name': 'Jerry',
      },
      'class': [
        {
          "name": 'class 1',
          'tag': '',
        },
        {},
      ],
    };
    
  3. 创建SafeMap对象

    SafeMap safeMap = SafeMap(map);
    
  4. 取值

    • 安全取值,错误的类型会返回null
      assert(safeMap['id'].value == 3);
      assert(safeMap['id'].string == null);
      
    • 错误的下标也会返回SafeMap(null)
      assert(safeMap['tag'].value == 'student');
      assert(safeMap['tag12345'].value == null);
      
    • 连续取值,可以一直安全取值,只会返回SafeMap(null)
      assert(safeMap['info']['name'].value == 'Jerry');
      assert(safeMap['a']['b']['b']['b']['b']['b'].value == null);
      
    • 取出数组,也可以通过数组下标继续取值:
      assert(safeMap['class'].list.length == 2);
      assert(safeMap['class'][0]['name'].value == 'class 1');
      
    • 空值判断:
      assert(safeMap['class'][0]['tag'].isEmpty());
      assert(safeMap['class'][1].isEmpty());
      
    • 越界也会返回SafeMap(null),判断isEmptytrue
      assert(safeMap['class'][2].isEmpty());
      
  5. 构建Flutter应用

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: '断言结束,运行正常'),
    );
    
  6. 显示结果

    class MyHomePage extends StatelessWidget {
      final String title;
    
      const MyHomePage({Key key, this.title}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Text(title),
          ),
        );
      }
    }
    

通过以上示例,你可以看到如何在Flutter中使用safemap插件来安全地从Map中取值,避免因错误的键或类型而导致的异常。


更多关于Flutter安全地图功能插件safemap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全地图功能插件safemap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成和使用safemap插件来实现安全地图功能的示例代码。需要注意的是,safemap这个插件名称在Flutter的官方插件库中并不直接存在,所以我们假设它是一个自定义的或者第三方提供的插件,并且它提供了一些基本的安全地图功能。

首先,确保你已经将safemap插件添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  safemap: ^x.y.z  # 替换为实际的版本号

然后,运行flutter pub get来安装插件。

接下来,在你的Flutter项目中,你可以按照以下步骤使用safemap插件:

  1. 导入插件

在你的Dart文件中,导入safemap插件:

import 'package:safemap/safemap.dart';
  1. 初始化地图

在你的Flutter组件中,初始化并显示地图。这里假设SafeMapWidgetsafemap插件提供的一个用于显示地图的组件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeMapScreen(),
    );
  }
}

class SafeMapScreen extends StatefulWidget {
  @override
  _SafeMapScreenState createState() => _SafeMapScreenState();
}

class _SafeMapScreenState extends State<SafeMapScreen> {
  SafeMapController? _mapController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Safe Map Example'),
      ),
      body: SafeMapWidget(
        onMapCreated: (SafeMapController controller) {
          _mapController = controller;
          // 可以在这里配置地图的初始状态,比如中心点、缩放级别等
          _mapController?.moveCamera(CameraUpdateFactory.newLatLngZoom(
            LatLng(37.7749, -122.4194), // 示例坐标:旧金山
            14.0,
          ));
        },
        apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 替换为你的Google Maps API密钥
        // 其他配置...
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 示例:在地图上添加一个标记
          if (_mapController != null) {
            _mapController?.addMarker(MarkerOptions(
              position: LatLng(37.7750, -122.4195), // 稍微偏移的坐标
              title: 'Sample Marker',
            ));
          }
        },
        tooltip: 'Add Marker',
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. 处理地图事件

你可以通过SafeMapController来处理地图的各种事件,比如用户点击、拖动地图等。这里只是简单地展示了如何添加标记,你可以根据需要扩展功能。

  1. 确保安全性

由于这是一个“安全地图”插件,它可能包含了一些额外的安全功能,比如位置模糊处理、敏感区域屏蔽等。你需要查阅safemap插件的文档来了解如何使用这些安全功能。

// 示例:假设有一个方法可以设置位置模糊级别
_mapController?.setLocationBlurLevel(5); // 5是假设的模糊级别参数

// 示例:假设有一个方法可以屏蔽敏感区域
_mapController?.blockSensitiveAreas([
  LatLngBounds(
    southwest: LatLng(37.7600, -122.4500),
    northeast: LatLng(37.7800, -122.3900),
  ),
]);

请注意,上述代码中的SafeMapWidgetSafeMapControllerCameraUpdateFactoryLatLngMarkerOptions等类和方法都是基于假设的,因为safemap插件的具体实现细节并未给出。你需要根据实际的safemap插件文档来调整代码。

最后,确保你的应用已经正确配置了Google Maps API密钥,并且遵守了Google Maps的使用条款和隐私政策。

回到顶部