Flutter旅行管理或路径规划插件journey的使用

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

Flutter旅行管理或路径规划插件journey的使用

Journey 是一个用于在Flutter应用中运行一次性迁移的包。它可以帮助开发者在应用发布后,逐步实现新功能的同时,尽量减少对应用启动时间的影响。

特性

  • 支持增量迁移。

开始使用

要在项目中使用 Journey,首先需要在 pubspec.yaml 文件中添加依赖:

dependencies:
  journey:

然后运行 flutter pub get 来获取该包。

使用方法

创建迁移类

创建具体的迁移实现类:

import 'package:journey/journey.dart';

class MigrateUserModelToHaveMultipleJourneys extends Migration {
  String get id => "migrate_user_model_to_have_multiple_journeys";

  @override
  Future<MigrationResult> migrate() async {
    // 修改数据模型中的底层数据结构
    return MigrationResult.successful;
  }
}

class MigrateTokensToNativeSecureStorage extends Migration {
  String get id => "migrate_tokens_to_native_secure_storage";

  @override
  Future<MigrationResult> migrate() async {
    // 从之前的存储中读取令牌,并将它们移动到安全存储中
    return MigrationResult.successful;
  }
}

定义旅程

定义包含所有迁移的 Journey 实例:

final journey = Journey(
  migrations: [
    MigrateUserModelToHaveMultipleJourneys(),
    MigrateTokensToNativeSecureStorage(),
  ],
);

执行迁移

在应用中合适的时间点执行这些迁移:

// 可以使用报告进行分析
final reports = await journey.migrate();

如果需要重新执行迁移或者测试时,可以回滚迁移:

// 回滚迁移
await journey.rollback();

// 重置所有迁移报告
await journey.reset();

示例Demo

下面是一个完整的示例代码,展示如何在Flutter应用中使用 Journey

import 'package:flutter/material.dart';
import 'package:journey/journey.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final sharedPreferences = await SharedPreferences.getInstance();

  runApp(JourneyExampleApp(
    sharedPreferences: sharedPreferences,
  ));
}

class JourneyExampleApp extends StatelessWidget {
  const JourneyExampleApp({
    required this.sharedPreferences,
    Key? key,
  }) : super(key: key);

  final SharedPreferences sharedPreferences;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Journey example app',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: JourneyHomepage(
          sharedPreferences: sharedPreferences,
        ),
      ),
      debugShowCheckedModeBanner: false,
    );
  }
}

class JourneyHomepage extends StatefulWidget {
  const JourneyHomepage({
    required this.sharedPreferences,
    Key? key,
  }) : super(key: key);

  final SharedPreferences sharedPreferences;

  @override
  State<JourneyHomepage> createState() => _JourneyHomepageState();
}

class _JourneyHomepageState extends State<JourneyHomepage> {
  late Journey _journey;

  @override
  Widget build(BuildContext context) {
    final backgroundImage =
        widget.sharedPreferences.getString("background_image") ??
            "background-purple.jpg";

    final migrations = {
      "Migrate to new style": MigrateToNewBackgroundImage(
        sharedPreferences: widget.sharedPreferences,
      ),
      "Migrate to new name": MigrateToNewStyle(
        sharedPreferences: widget.sharedPreferences,
      ),
    };

    _journey = Journey(
      migrations: migrations.values.toList(),
    );

    return Stack(
      children: [
        SizedBox.expand(
          child: Image(
            image: AssetImage("images/$backgroundImage"),
            fit: BoxFit.cover,
          ),
        ),
        Align(
          alignment: Alignment.topCenter,
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Text(
              widget.sharedPreferences.getString("app_name") ?? "Journey",
              style: const TextStyle(
                fontSize: 32,
                fontWeight: FontWeight.bold,
                color: Colors.white,
                shadows: <Shadow>[
                  Shadow(
                    offset: Offset(2.0, 2.0),
                    blurRadius: 3.0,
                    color: Colors.black,
                  ),
                ],
              ),
            ),
          ),
        ),
        Positioned(
          bottom: 0,
          left: 0,
          right: 0,
          child: Center(
            child: Padding(
              padding: const EdgeInsets.all(16),
              child: Column(
                children: [
                  Padding(
                    padding: const EdgeInsets.symmetric(vertical: 8),
                    child: ElevatedButton(
                      child: const Text("Migrate"),
                      onPressed: () async {
                        await _journey.migrate();
                        setState(() {});
                      },
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(vertical: 8),
                    child: ElevatedButton(
                      child: const Text("Rollback"),
                      onPressed: () async {
                        await _journey.rollback();
                        setState(() {});
                      },
                    ),
                  ),
                ],
              ),
            ),
          ),
        )
      ],
    );
  }
}

这个示例展示了如何在Flutter应用中集成和使用 Journey 包来管理和执行应用内的迁移操作。通过这种方式,你可以更轻松地为应用引入新功能并确保其顺利过渡。


更多关于Flutter旅行管理或路径规划插件journey的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter旅行管理或路径规划插件journey的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,使用journey插件可以帮助开发者实现旅行管理或路径规划的功能。以下是一个简单的代码示例,展示了如何在Flutter项目中集成并使用journey插件进行基本的路径规划。

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

dependencies:
  flutter:
    sdk: flutter
  journey: ^最新版本号  # 请替换为实际发布的最新版本号

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

接下来,你可以在你的Flutter项目中使用journey插件。以下是一个基本的示例,展示了如何初始化插件并进行路径规划:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Journey? _journey;
  List<LatLng>? _route;

  @override
  void initState() {
    super.initState();
    // 初始化Journey插件
    _journey = Journey();
    _journey!.initialize().then((_) {
      // 初始化成功后,进行路径规划
      _planRoute();
    }).catchError((error) {
      print('Failed to initialize Journey: $error');
    });
  }

  void _planRoute() async {
    try {
      // 设置起点和终点坐标
      LatLng origin = LatLng(37.7749, -122.4194); // 例如:旧金山
      LatLng destination = LatLng(34.0522, -118.2437); // 例如:洛杉矶

      // 获取路径规划结果
      var routeResponse = await _journey!.routeBetweenCoordinates(
        origin: origin,
        destination: destination,
        travelMode: TravelMode.driving, // 可以根据需要设置为driving, walking, cycling等
      );

      // 处理路径规划结果
      if (routeResponse.isSuccess) {
        setState(() {
          _route = routeResponse.route?.geometry?.points;
        });
      } else {
        print('Failed to plan route: ${routeResponse.errorMessage}');
      }
    } catch (error) {
      print('Error planning route: $error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Journey Plugin Demo'),
        ),
        body: Center(
          child: _route == null
              ? CircularProgressIndicator() // 加载中
              : GoogleMap(
                  mapType: MapType.normal,
                  initialCameraPosition: CameraPosition(
                    target: LatLng((_route!.first.latitude + _route!.last.latitude) / 2,
                        (_route!.first.longitude + _route!.last.longitude) / 2),
                    zoom: 10,
                  ),
                  polylines: {
                    PolylineOptions(
                      polylineId: PolylineId('route'),
                      color: Colors.blue,
                      width: 4,
                      points: _route!,
                    ),
                  },
                  markers: {
                    MarkerOptions(
                      markerId: MarkerId('origin'),
                      position: _route!.first,
                      infoWindow: InfoWindow(title: 'Origin'),
                    ),
                    MarkerOptions(
                      markerId: MarkerId('destination'),
                      position: _route!.last,
                      infoWindow: InfoWindow(title: 'Destination'),
                    ),
                  },
                ),
        ),
      ),
    );
  }
}

注意

  1. 上面的代码示例中使用了GoogleMap来显示路径,但journey插件本身并不包含地图显示功能。为了显示地图,你需要添加google_maps_flutter插件作为依赖,并确保你的项目已经配置了Google Maps API密钥。
  2. 路径规划的起点和终点坐标需要根据实际情况进行调整。
  3. 旅行模式(TravelMode)可以根据需求设置为驾驶、步行、骑行等。

请确保在实际项目中处理错误和异常情况,并根据需要进行UI和功能的定制。

回到顶部