Flutter字体管理插件flutter_overpass的使用

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

Flutter Overpass Plugin

Flutter Overpass Plugin 是一个用于从 Overpass API 和 Nominatim 获取数据的插件,支持 Android 和 iOS 平台。本文将介绍如何使用这个插件。

Features

  • ✅ 根据坐标和半径获取附近的地点。
  • ✅ 使用原始的 Overpass QL 语句来获取结果。
  • ✅ 根据给定的坐标获取地点。
  • ✅ 通过地址搜索。

How to Use

首先,确保在 pubspec.yaml 文件中添加 flutter_overpass 插件:

dependencies:
  flutter:
    sdk: flutter
  flutter_overpass: ^0.1.0 # 确保使用最新版本

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

示例代码

以下是一个完整的示例应用,展示如何使用 flutter_overpass 插件进行各种查询操作:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_overpass/flutter_overpass.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _flutterOverpassPlugin = FlutterOverpass();
  final _isLoading = ValueNotifier<bool>(false);
  final _controllerLatitude = TextEditingController(text: '37.79396544487583');
  final _controllerLongitude = TextEditingController(text: '-122.3838801383972');
  final _controllerRadius = TextEditingController(text: '200');
  final _controllerAddress = TextEditingController(text: 'Rihanna Drive');
  final _controllerQuery = TextEditingController(
      text: 'node(around:200,37.79396544487583,-122.3838801383972);');

  String _results = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  [@override](/user/override)
  void dispose() {
    _isLoading.dispose();
    _controllerLatitude.dispose();
    _controllerLongitude.dispose();
    _controllerRadius.dispose();
    _controllerAddress.dispose();
    _controllerQuery.dispose();
    super.dispose();
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await _flutterOverpassPlugin.getPlatformVersion() ??
          'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Overpass'),
        ),
        body: Stack(
          children: [
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 16),
              child: Column(
                children: [
                  const Text(
                    'Results:',
                    style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),
                  ),
                  Container(
                    height: 100,
                    padding: const EdgeInsets.all(4),
                    decoration: BoxDecoration(border: Border.all(color: Colors.grey)),
                    child: SingleChildScrollView(child: Center(child: Text(_results))),
                  ),
                  Expanded(
                    child: ListView(
                      children: [
                        Center(child: Text('Running on: $_platformVersion\n')),
                        TextFormField(
                          decoration: const InputDecoration(labelText: 'Latitude'),
                          controller: _controllerLatitude,
                          keyboardType: const TextInputType.numberWithOptions(decimal: true),
                        ),
                        TextFormField(
                          decoration: const InputDecoration(labelText: 'Longitude'),
                          controller: _controllerLongitude,
                          keyboardType: const TextInputType.numberWithOptions(decimal: true),
                        ),
                        TextFormField(
                          decoration: const InputDecoration(labelText: 'Radius'),
                          controller: _controllerRadius,
                          keyboardType: const TextInputType.numberWithOptions(decimal: true),
                        ),
                        TextFormField(
                          decoration: const InputDecoration(labelText: 'Address'),
                          controller: _controllerAddress,
                        ),
                        const SizedBox(height: 8),
                        Center(
                          child: TextButton(
                            onPressed: () async {
                              if (_controllerLongitude.text.isEmpty ||
                                  _controllerLatitude.text.isEmpty ||
                                  _controllerRadius.text.isEmpty) return;
                              _isLoading.value = true;
                              setState(() {
                                _results = '';
                              });
                              final result = await _flutterOverpassPlugin.getNearbyNodes(
                                latitude: double.parse(_controllerLatitude.text),
                                longitude: double.parse(_controllerLongitude.text),
                                radius: double.parse(_controllerRadius.text),
                              );
                              setState(() {
                                _results = result.toString();
                              });
                              _isLoading.value = false;
                            },
                            child: const Text('Get Nearby Nodes'),
                          ),
                        ),
                        Center(
                          child: TextButton(
                            onPressed: () async {
                              if (_controllerLongitude.text.isEmpty ||
                                  _controllerLatitude.text.isEmpty) return;
                              _isLoading.value = true;
                              setState(() {
                                _results = '';
                              });
                              final result = await _flutterOverpassPlugin
                                  .getPlaceFromCoordinate(
                                latitude: double.parse(_controllerLatitude.text),
                                longitude: double.parse(_controllerLongitude.text),
                              );
                              setState(() {
                                _results = result.toString();
                              });
                              _isLoading.value = false;
                            },
                            child: const Text('Get Place From Coordinate'),
                          ),
                        ),
                        Center(
                          child: TextButton(
                            onPressed: () async {
                              if (_controllerAddress.text.isEmpty) return;
                              _isLoading.value = true;
                              setState(() {
                                _results = '';
                              });
                              final result = await _flutterOverpassPlugin.searchAddress(
                                address: _controllerAddress.text,
                              );
                              setState(() {
                                _results =
                                    result.map((e) => e.toString()).join('\n');
                              });
                              _isLoading.value = false;
                            },
                            child: const Text('Search Address'),
                          ),
                        ),
                        const SizedBox(height: 44),
                        TextFormField(
                          decoration: const InputDecoration(labelText: 'Overpass Query'),
                          controller: _controllerQuery,
                        ),
                        Center(
                          child: TextButton(
                            onPressed: () async {
                              _isLoading.value = true;
                              setState(() {
                                _results = '';
                              });
                              final result = await _flutterOverpassPlugin.rawOverpassQL(
                                query: _controllerQuery.text,
                              );
                              setState(() {
                                _results = result.toString();
                              });
                              _isLoading.value = false;
                            },
                            child: const Text('Run query'),
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
            ValueListenableBuilder(
              valueListenable: _isLoading,
              builder: (BuildContext context, bool value, Widget? child) {
                return value
                    ? Container(
                        color: Colors.black.withOpacity(0.5),
                        width: double.infinity,
                        height: double.infinity,
                        child: const Center(child: CircularProgressIndicator()),
                      )
                    : const SizedBox();
              },
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用flutter_overpass插件进行字体管理的代码示例。flutter_overpass是一个Flutter插件,用于轻松集成Overpass字体到你的应用中。假设你已经将flutter_overpass添加到了你的pubspec.yaml文件中,以下是具体的使用步骤:

1. 添加依赖

首先,确保你的pubspec.yaml文件中已经添加了flutter_overpass依赖:

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

然后运行flutter pub get来获取依赖。

2. 导入插件

在你的Dart文件中导入flutter_overpass

import 'package:flutter_overpass/flutter_overpass.dart';

3. 使用Overpass字体

3.1 初始化插件

在你的应用入口(通常是main.dart)中初始化flutter_overpass插件:

void main() {
  runApp(MyApp());
  // 初始化Overpass字体(通常在应用启动时调用一次)
  OverpassFont.load();
}

3.2 应用全局字体样式

你可以通过OverpassTextThemeOverpassTextStyle来自定义和应用Overpass字体样式。以下是一个完整的示例,展示如何在整个应用中应用Overpass字体:

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

void main() {
  runApp(MyApp());
  // 初始化Overpass字体
  OverpassFont.load();
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Overpass Demo',
      theme: ThemeData(
        // 使用OverpassTextTheme来设置全局文本主题
        textTheme: OverpassTextTheme.light(),
        // 或者你可以自定义OverpassTextStyle
        // primaryTextTheme: TextTheme(
        //   headline1: OverpassTextStyle.headline1(color: Colors.black),
        //   bodyText1: OverpassTextStyle.bodyText1(color: Colors.grey),
        //   // ... 其他文本样式
        // ),
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Overpass Font Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello, Overpass!',
              style: OverpassTextStyle.headline1, // 使用OverpassTextStyle
            ),
            SizedBox(height: 20),
            Text(
              'This is a sample text using Overpass font.',
              style: OverpassTextStyle.bodyText1, // 使用OverpassTextStyle
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们首先初始化了OverpassFont,然后在ThemeData中使用了OverpassTextTheme来设置全局文本主题。你也可以选择自定义OverpassTextStyle来更精细地控制不同文本组件的样式。

4. 运行应用

现在,你可以运行你的Flutter应用,应该会看到所有文本都使用了Overpass字体。

这个示例展示了如何在Flutter项目中集成和使用flutter_overpass插件进行字体管理。如果你有更具体的需求,比如动态加载字体或者处理不同权重和样式的字体,你可以参考flutter_overpass的官方文档或源代码以获取更多信息。

回到顶部