Flutter韩国邮政编码搜索插件daum_postcode_search的使用

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

Flutter韩国邮政编码搜索插件daum_postcode_search的使用

daum_postcode_search 是一个用于在Flutter应用中集成韩国邮政编码搜索服务的插件。该插件利用InAppWebView加载Daum Postcode服务,从而实现地址搜索功能。

Setup 设置

Android

在AndroidManifest.xml文件中的 <application> 标签内添加 android:usesCleartextTraffic="true"。由于Daum Postcode服务的部分内容不使用SSL,因此如果不设置此权限,可能会出现明文流量相关的错误。

Example 示例代码

以下是使用 daum_postcode_search 包实现搜索页面的例子:

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

class SearchingPage extends StatefulWidget {
  [@override](/user/override)
  _SearchingPageState createState() => _SearchingPageState();
}

class _SearchingPageState extends State<SearchingPage> {
  bool _isError = false;
  String? errorMessage;

  [@override](/user/override)
  Widget build(BuildContext context) {
    DaumPostcodeSearch daumPostcodeSearch = DaumPostcodeSearch(
      onConsoleMessage: (_, message) => print(message),
      onLoadError: (controller, uri, errorCode, message) => setState(
        () {
          _isError = true;
          errorMessage = message;
        },
      ),
      onLoadHttpError: (controller, uri, errorCode, message) => setState(
        () {
          _isError = true;
          errorMessage = message;
        },
      ),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text("地址搜索页面"),
        centerTitle: true,
      ),
      body: Container(
        child: Column(
          children: [
            Expanded(
              child: daumPostcodeSearch,
            ),
            Visibility(
              visible: _isError,
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  Text(errorMessage ?? ""),
                  ElevatedButton(
                    child: Text("刷新"),
                    onPressed: () {
                      daumPostcodeSearch.controller?.reload();
                    },
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

以下是如何显示通过上述 SearchingPage 搜索到的结果的完整示例:

class DaumPostcodeSearchExample extends StatefulWidget {
  DaumPostcodeSearchExample({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  _DaumPostcodeSearchExampleState createState() =>
      _DaumPostcodeSearchExampleState();
}

class _DaumPostcodeSearchExampleState extends State<DaumPostcodeSearchExample> {
  DataModel? _daumPostcodeSearchDataModel;

  TableRow _buildTableRow(String label, String value) {
    return TableRow(
      children: [
        TableCell(
          verticalAlignment: TableCellVerticalAlignment.middle,
          child: Text(label, textAlign: TextAlign.center),
        ),
        TableCell(
          child: Text(value, textAlign: TextAlign.center),
        ),
      ],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Padding(
          padding: EdgeInsets.all(10),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              ElevatedButton.icon(
                onPressed: () async {
                  try {
                    DataModel model = await Navigator.of(context).push(
                      MaterialPageRoute(
                        builder: (context) => SearchingPage(),
                      ),
                    );

                    setState(() {
                      _daumPostcodeSearchDataModel = model;
                    });
                  } catch (error) {
                    print(error);
                  }
                },
                icon: Icon(Icons.search),
                label: Text("地址搜索"),
              ),
              Visibility(
                visible: _daumPostcodeSearchDataModel != null,
                child: Card(
                  child: Padding(
                    padding: EdgeInsets.all(10),
                    child: Column(
                      children: [
                        Padding(
                          padding: EdgeInsets.all(10),
                          child: RichText(
                            text: TextSpan(
                              style: TextStyle(color: Colors.black, fontSize: 20),
                              children: [
                                WidgetSpan(
                                  child: Icon(
                                    Icons.check_circle,
                                    color: Theme.of(context).colorScheme.secondary,
                                  ),
                                ),
                                TextSpan(text: "地址搜索结果"),
                              ],
                            ),
                          ),
                        ),
                        Table(
                          border: TableBorder.symmetric(
                              inside: BorderSide(color: Colors.grey)),
                          columnWidths: {
                            0: FlexColumnWidth(1),
                            1: FlexColumnWidth(2),
                          },
                          children: [
                            _buildTableRow(
                              "韩文地址",
                              _daumPostcodeSearchDataModel?.address ?? "",
                            ),
                            _buildTableRow(
                              "英文地址",
                              _daumPostcodeSearchDataModel?.addressEnglish ?? "",
                            ),
                            _buildTableRow(
                              "邮政编码",
                              _daumPostcodeSearchDataModel?.zonecode ?? "",
                            ),
                            _buildTableRow(
                              "地名地址",
                              _daumPostcodeSearchDataModel?.autoJibunAddress ?? "",
                            ),
                            _buildTableRow(
                              "地名地址(英文)",
                              _daumPostcodeSearchDataModel?.autoJibunAddressEnglish ?? "",
                            )
                          ],
                        )
                      ],
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter韩国邮政编码搜索插件daum_postcode_search的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter韩国邮政编码搜索插件daum_postcode_search的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用daum_postcode_search插件来实现韩国邮政编码搜索的示例代码。这个插件利用了Daum Postcode API,它允许用户搜索韩国地址并获取相应的邮政编码。

第一步:添加依赖

首先,在你的pubspec.yaml文件中添加daum_postcode_search依赖:

dependencies:
  flutter:
    sdk: flutter
  daum_postcode_search: ^0.2.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

第二步:配置Android和iOS

由于daum_postcode_search依赖于网络请求,你需要确保在Android和iOS上都配置了网络权限。

Android

通常,Flutter项目默认已经配置了网络权限,但你可以在android/app/src/main/AndroidManifest.xml中确认:

<uses-permission android:name="android.permission.INTERNET"/>

iOS

ios/Runner/Info.plist中,确保有NSAppTransportSecurity配置以允许网络请求:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

第三步:使用插件

在你的Flutter项目中,你可以按照以下步骤使用daum_postcode_search插件。

1. 导入插件

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

import 'package:daum_postcode_search/daum_postcode_search.dart';

2. 配置API Key

你需要从Daum开发者平台获取一个API Key,然后在你的Flutter项目中配置它。你可以在android/app/build.gradleios/Runner/Info.plist中配置API Key(但更安全的做法是通过环境变量或Flutter的配置文件来管理)。

为了简化示例,这里假设你直接在代码中硬编码API Key(不推荐在生产环境中这样做):

final String apiKey = "YOUR_DAUM_API_KEY";

3. 显示搜索界面

使用DaumPostcodeSearch小部件来显示搜索界面:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Daum Postcode Search Example'),
        ),
        body: Center(
          child: DaumPostcodeSearchButton(
            apiKey: "YOUR_DAUM_API_KEY",
            onResult: (result) {
              // 处理搜索结果
              print("Address: ${result.address}");
              print("Postcode: ${result.postcode}");
              // 你可以在这里更新UI或做其他处理
            },
            onError: (error) {
              // 处理错误
              print("Error: $error");
            },
          ),
        ),
      ),
    );
  }
}

在上面的代码中,DaumPostcodeSearchButton是一个小部件,当用户点击它时,会打开一个Daum邮政编码搜索界面。搜索完成后,结果会通过onResult回调返回,错误会通过onError回调返回。

注意事项

  1. API Key管理:避免在代码中硬编码API Key,使用更安全的方法如环境变量或Flutter的配置文件来管理API Key。
  2. 错误处理:在实际应用中,确保妥善处理错误情况,如网络错误或API限制。
  3. UI更新:根据搜索结果更新UI时,确保在UI线程中执行更新操作。

这样,你就可以在Flutter应用中集成并使用daum_postcode_search插件来实现韩国邮政编码搜索功能了。

回到顶部