flutter实战 -- 百度地图

在国内一般无法使用location提供的谷歌定位功能,所以只能选择百度地图或者高德地图提供的定位服务

1-申请AK

1-百度地图官网:flutter | 百度地图API SDK (baidu.com)

控制台 | 百度地图开放平台 (baidu.com)

2-根据提示进行认证,认证成功后跳转如下页面

3-填写应用名称和类型

4-输入以下内容SHA1和PackageName

获取包名:

获取SHA1:

1-打开cmd,输入cd .android

报错:

原因:jdk的路径没有保存进path中

找到自己的jdk文件,将路径 E:/java/jdk/bin存在PATH即可

关闭命令管理器,重新打开

输入cd .android

2-输入口令

调试版本默认密码是: android,发布模式的密码是apk的keystore设置的密码,没有直接回车

如果发现没有SHA1

解决方案

1.生成新的调试密匙

keytool -genkey -v -keystore new_debug.keystore -storepass your_password -keyalg RSA -keysize 2048 -validity 10000 -alias androiddebugkey

2-执行以下命令获取调试密匙

keytool -list -v -keystore new_debug.keystore -alias androiddebugkey

3-提交

5-获取AK成功

flutter | 百度地图API SDK (baidu.com)

2-SDK相关配置

申请Ak成功后,就可以进行如下操作了

1-在pubspec.yaml文件中引入以下依赖

flutter_baidu_mapapi_map: ^3.0.0+2 
flutter_baidu_mapapi_search: 3.2.0 
flutter_bmflocation: 3.2.1

2-在终端输入flutter pub get

如果没有报错信息,即可进行下一步

如果有报错信息,检查一下是不是版本冲突的问题,我的sdk是2.19.6

3-打开android/app/src/main/java/com/example/envcapp/,新建一个java文件,命名为MyApplication

写入以下代码,改一下包名

package com.example.envcapp;
// import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.base.BmfMapApplication;
import io.flutter.app.FlutterApplication;

public class MyApplication extends BmfMapApplication  {

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

4-打开android/app/src/main/AndroidManifest.xml

1-将name改为MyApplication

2-引入权限

    <!-- 这个权限用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 这个权限用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!-- 用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- 读取系统信息,包含系统版本等信息,用作统计-->
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <!-- 程序在手机屏幕关闭后后台进程仍然运行-->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

3-在下引入key

<meta-data 
    android:name="com.baidu.lbsapi.API_KEY" 
    android:value="你的百度key" />

5-打开android/app/build-gradle

引入以下代码

buildTypes {
        release {
            signingConfig signingConfigs.debug
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

6-在android/app/下新建文件proguard-rules.pro

写入以下代码

-keep class com.baidu.** {*;} 
-keep class vi.com.** {*;} 
-keep class com.baidu.vi.** {*;} 
-dontwarn com.baidu.**

3-创建地图

import 'package:envcapp/pages/Weather.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_baidu_mapapi_base/src/map/bmf_models.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:flutter_baidu_mapapi_search/flutter_baidu_mapapi_search.dart';


class WeatherMapPage extends StatefulWidget{
  const WeatherMapPage({super.key});

  @override
  State<WeatherMapPage> createState() => WeatherMapState();
 
}

class WeatherMapState extends State<WeatherMapPage>{
  BMFMapController? dituController;
  @override
  void initState() {
    super.initState();
  }
  
  /// 创建完成回调
  void onBMFMapCreated(BMFMapController controller) {
    dituController = controller;

    /// 地图加载回调
    dituController?.setMapDidLoadCallback(callback: () {
      print('mapDidLoad-地图加载完成!!!');
    });
  }
  /// 设置地图参数
  BMFMapOptions initMapOptions() {
    BMFMapOptions mapOptions = BMFMapOptions(
      center: BMFCoordinate(39.917215, 116.380341),
      zoomLevel: 12,
      changeCenterWithDoubleTouchPointEnabled:true,
      gesturesEnabled:true ,
      scrollEnabled:true ,
      zoomEnabled: true ,
      rotateEnabled :true,
      compassPosition :BMFPoint(0,0) ,
      showMapScaleBar:false ,
      maxZoomLevel:15,
      minZoomLevel:8,
//      mapType: BMFMapType.Satellite
    );
    return mapOptions;
  }

  @override
  Widget build(BuildContext context) {
    Size screenSize = MediaQuery.of(context).size;
    return  Scaffold(     
      backgroundColor: Color.fromRGBO(240, 243, 250, 1), 
      body: Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),
        ),
        child: Stack(
          children: [
            Container(
              width: screenSize.width,
              height: screenSize.height,
              child: BMFMapWidget(                  
              onBMFMapCreated: (controller) {
                onBMFMapCreated(controller);
              },
              mapOptions: initMapOptions(),
              ),
            ),
            Positioned(
              top: 20,
              left: 5,
              child: IconButton(
                onPressed: (){
                  Navigator.push(context, MaterialPageRoute(builder: (context) =>const Weather()));
                }, 
                icon:const Icon(Icons.navigate_before,color: Color.fromRGBO(0, 0, 0, 0.3),size: 40,), 
                ),
            )

          ],
        ),
      )
    );
  }
}

有关百度地图遇到的报错可以看我的下一篇文章flutter实战 -- 百度地图报错-CSDN博客

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flutter中的TextField是一个常用的输入控件,它允许用户在应用程序中输入文本。 TextField通常用于表单中,可以接收用户输入的文本,比如用户名、密码、电子邮件地址等。 以下是一个基本的TextField示例: ```dart TextField( decoration: InputDecoration( hintText: '请输入文本', ), ); ``` 在上面的示例中,我们使用了decoration属性来设置TextField的外观,其中hintText属性用于设置提示文本。 TextField还有许多其他的属性可以设置,比如maxLength(允许输入的最大长度)、keyboardType(键盘类型)、obscureText(是否隐藏输入内容)等等。 下面是一个更完整的TextField示例: ```dart class MyTextField extends StatefulWidget { @override _MyTextFieldState createState() => _MyTextFieldState(); } class _MyTextFieldState extends State<MyTextField> { final TextEditingController _controller = TextEditingController(); @override Widget build(BuildContext context) { return TextField( controller: _controller, maxLength: 10, keyboardType: TextInputType.text, obscureText: true, decoration: InputDecoration( hintText: '请输入文本', labelText: '文本框', prefixIcon: Icon(Icons.text_fields), suffixIcon: IconButton( icon: Icon(Icons.clear), onPressed: () { setState(() { _controller.clear(); }); }, ), border: OutlineInputBorder(), ), onChanged: (value) { print('输入的文本为:$value'); }, ); } } ``` 在上面的示例中,我们使用了TextEditingController来控制TextField的文本内容,maxLength属性限制了用户输入的最大长度为10,keyboardType属性指定了键盘类型为文本类型,obscureText属性设置为true表示隐藏输入内容。 此外,我们还设置了decoration属性来自定义TextField的外观,包括了输入提示文本、标签文本、前缀图标、后缀图标和边框样式等。 最后,我们通过onChanged回调函数来监听用户输入的文本,并打印出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值