Flutter未知功能插件papilio的使用(注:由于介绍为undefined,故以“未知功能”代替具体功能)

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

Flutter未知功能插件papilio的使用

Papilio

构建美观的应用程序使用Flutter。

可以在浏览器中查看实时示例应用Papilio Note。所有源代码都可以在这里找到。或者,可以查看此包的简单示例应用这里。注意,两个示例都完全集成了浏览器导航。

Papilio Note

声明式框架用于Flutter

轻松组合您的应用程序,并将管道留给框架。

关心分离

将应用程序的逻辑与其呈现方式分开。

状态管理的BloC方法

向业务逻辑组件发送事件,并让框架从流处理UI更改。

组合您的依赖项

在应用程序需要时使用依赖注入访问您的依赖项。papilio 使用 ioc_container 包。

导航的声明式方法

指定页面名称和 StatelessWidget,以便无缝地在页面之间切换。响应 BloC 处理程序而不是 UI 回调进行导航。

您可以像这样组合您的应用程序。这很好。

void main() {
  const incrementName = '/increment';
  const incrementKey = ValueKey(incrementName);
  const decrementName = '/decrement';
  const decrementKey = ValueKey(decrementName);

  final builder = IocContainerBuilder();

  builder.addRouting(
    (container) => PapilioRoutingConfiguration<PageRoute>(
        buildRoutes: (delegateBuilder) => delegateBuilder
          ..addPage<PageState>(
              container: container,
              name: incrementName,
              initialState: (arguments) => const PageState(0, 0),
              pageBody: (context) => const MyHomePage<Increment>(
                  title: "Papilio Sample - Increment"),
              buildBloc: (blocBuilder, container) => blocBuilder
                ..addSyncHandler<Increment>((state, event) =>
                    state.copyWith(counter: state.counter + 1))
                ..addSyncHandler<NavigateToIndex>((state, event) {
                  if (event.index == 0) {
                    return state;
                  }
                  container.navigate<PageState, PageRoute>(decrementKey);
                  return state;
                }))
          ..addPage<PageState>(
              container: container,
              name: decrementName,
              initialState: (arguments) => const PageState(10, 1),
              pageBody: (context) => const MyHomePage<Decrement>(
                  title: "Papilio Sample - Decrement"),
              buildBloc: (blocBuilder, container) => blocBuilder
                ..addSyncHandler<Decrement>((state, event) =>
                    state.copyWith(counter: state.counter - 1))
                ..addSyncHandler<NavigateToIndex>((state, event) {
                  if (event.index == 1) {
                    return state;
                  }
                  container.navigate<PageState, PageRoute>(incrementKey);
                  return state;
                })),
        currentRouteConfiguration: (page) => page.name == incrementName
            ? const PageRoute(Page.increment)
            : const PageRoute(Page.decrement),
        parseRouteInformation: (routeInformation) async =>
            routeInformation.location == incrementName
                ? const PageRoute(Page.increment)
                : const PageRoute(Page.decrement),
        restoreRouteInformation: (pageRoute) => RouteInformation(
            location: pageRoute.page == Page.increment
                ? incrementName
                : decrementName),
        onSetNewRoutePath: (delegate, route) async =>
            route.page == Page.increment
                ? delegate.navigate<PageState>(incrementKey)
                : delegate.navigate<PageState>(decrementKey),
        onInit: (delegate, container) =>
            delegate.navigate<PageState>(incrementKey)),
  );

  final container = builder.toContainer();
  runApp(MyApp(container));
}

Papilio Note 示例中的小部件测试全面覆盖了此包,但此存储库很快将有单元测试。查看小部件测试 在这里

示例代码

import 'package:flutter/material.dart';
import 'package:ioc_container/ioc_container.dart';
import 'package:papilio/bloc.dart';
import 'package:papilio/container_extensions.dart';
import 'package:papilio/papilio_route_information_parser.dart';
import 'package:papilio/papilio_router_delegate.dart';
import 'package:papilio/papilio_routing_configuration.dart';
import 'package:papilio/state_holder.dart';

enum Page { increment, decrement }

[@immutable](/user/immutable)
class PageRoute {
  final Page page;

  const PageRoute(this.page);
}

[@immutable](/user/immutable)
class PageState {
  final int counter;
  final int currentIndex;

  const PageState(this.counter, this.currentIndex);

  PageState copyWith({int? counter}) => PageState(counter ?? this.counter, currentIndex);
}

[@immutable](/user/immutable)
class Increment extends BlocEvent {}

[@immutable](/user/immutable)
class Decrement extends BlocEvent {}

[@immutable](/user/immutable)
class NavigateToIndex extends BlocEvent {
  final int index;
  NavigateToIndex(this.index);
}

void main() {
  const incrementName = '/increment';
  const incrementKey = ValueKey(incrementName);
  const decrementName = '/decrement';
  const decrementKey = ValueKey(decrementName);

  // 我们使用Ioc容器来存储RouterDelegate,RouteInformationParser
  // BloCs,状态和其他服务
  final builder = IocContainerBuilder();

  // 这是将papilio路由添加到您的应用程序的主要方法。
  builder.addRouting(
    (container) => PapilioRoutingConfiguration<PageRoute>(
        buildRoutes: (delegateBuilder) => delegateBuilder
          // 我们在此处添加Increment页面
          ..addPage<PageState>(
              container: container,
              name: incrementName,
              initialState: (arguments) => const PageState(0, 0),
              // 页面体始终是一个无状态小部件
              pageBody: (context) => const MyHomePage<Increment>(
                  title: "Papilio Sample - Increment"),
              // 这是我们如何定义与BloC相关的业务逻辑。
              // 我们添加处理Navigate,Increment和Decrement事件的处理器。
              buildBloc: (blocBuilder, container) => blocBuilder
                ..addSyncHandler<Increment>((state, event) =>
                    // 我们使用非破坏性突变(copyWith)来增加计数器
                    state.copyWith(counter: state.counter + 1))
                ..addSyncHandler<NavigateToIndex>((state, event) {
                  if (event.index == 0) {
                    return state;
                  }
                  container.navigate<PageState, PageRoute>(decrementKey);
                  return state;
                }))
          ..addPage<PageState>(
              container: container,
              name: decrementName,
              initialState: (arguments) => const PageState(10, 1),
              pageBody: (context) => const MyHomePage<Decrement>(
                  title: "Papilio Sample - Decrement"),
              buildBloc: (blocBuilder, container) => blocBuilder
                ..addSyncHandler<Decrement>((state, event) =>
                    state.copyWith(counter: state.counter - 1))
                ..addSyncHandler<NavigateToIndex>((state, event) {
                  if (event.index == 1) {
                    return state;
                  }
                  container.navigate<PageState, PageRoute>(incrementKey);
                  return state;
                )),
        // 这是为了浏览器等的管道。papilio的下一个版本将有一个基本的页面路由,不需要这些。
        currentRouteConfiguration: (page) => page.name == incrementName
            ? const PageRoute(Page.increment)
            : const PageRoute(Page.decrement),
        parseRouteInformation: (routeInformation) async =>
            routeInformation.location == incrementName
                ? const PageRoute(Page.increment)
                : const PageRoute(Page.decrement),
        restoreRouteInformation: (pageRoute) => RouteInformation(
            location: pageRoute.page == Page.increment
                ? incrementName
                : decrementName),
        onSetNewRoutePath: (delegate, route) async =>
            route.page == Page.increment
                ? delegate.navigate<PageState>(incrementKey)
                : delegate.navigate<PageState>(decrementKey),
        onInit: (delegate, container) =>
            delegate.navigate<PageState>(incrementKey)),
  );

  final container = builder.toContainer();
  runApp(MyApp(container));
}

class MyApp extends StatelessWidget {
  final IocContainer container;

  MyApp(this.container, {Key? key}) : super(key: key);

  // 这个小部件是您的应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp.router(
      debugShowCheckedModeBanner: false,
      routerDelegate: container.get<PapilioRouterDelegate<PageRoute>>(),
      routeInformationParser:
          container.get<PapilioRouteInformationParser<PageRoute>>(),
    );
  }
}

class MyHomePage<T extends BlocEvent> extends StatelessWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  Widget build(BuildContext context) {
    final snapshot = StateHolder.of<Snapshot<PageState>>(context).state;

    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Stack(children: [
          Align(
              child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text(
                'You have pushed the button this many times:',
              ),
              Text(
                snapshot.state.counter.toString(),
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          )),
          Align(
              alignment: Alignment.bottomCenter,
              child: SizedBox(
                height: 80,
                width: double.infinity,
                child: BottomNavigationBar(
                    currentIndex: snapshot.state.currentIndex,
                    onTap: (index) =>
                        snapshot.sendEventSync(NavigateToIndex(index)),
                    items: const [
                      BottomNavigationBarItem(
                          icon: Icon(Icons.add), label: "Increment"),
                      BottomNavigationBarItem(
                          icon: Icon(Icons.remove), label: "Decrement"),
                    ]),
              ))
        ]),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () =>
            snapshot.sendEventSync(T == Increment ? Increment() : Decrement()),
        tooltip: T == Increment ? 'Increment' : 'Decrement',
        child: Icon(T == Increment ? Icons.add : Icons.remove),
      ),
    );
  }
}

更多关于Flutter未知功能插件papilio的使用(注:由于介绍为undefined,故以“未知功能”代替具体功能)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件papilio的使用(注:由于介绍为undefined,故以“未知功能”代替具体功能)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,了解一个未知功能的Flutter插件时,我们可以从基本的集成和使用步骤入手。由于papilio插件的具体功能未定义,以下代码案例将展示如何集成一个Flutter插件并尝试调用其基本方法(假设插件有这些方法)。请注意,实际应用中应根据插件的官方文档进行调整。

1. 添加依赖

首先,在pubspec.yaml文件中添加papilio插件的依赖。由于这是一个假设的插件,这里我们使用一个占位符名称。实际使用时,请替换为插件的真实名称和版本。

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

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

2. 导入插件

在需要使用papilio插件的Dart文件中导入它:

import 'package:papilio/papilio.dart';

3. 初始化插件(如果必要)

有些插件需要在应用启动时进行初始化。这通常在Main函数或某个服务类中完成。

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 假设papilio有一个初始化方法
  Papilio.instance.initialize(); 
  runApp(MyApp());
}

4. 使用插件功能

由于具体功能未知,我们将假设papilio插件有一个performUnknownFunction方法,并尝试调用它。

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化插件(如果需要)
  // Papilio.instance.initialize(); 
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Papilio Plugin Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 调用假设的插件方法
              _usePapilioPlugin();
            },
            child: Text('Perform Unknown Function'),
          ),
        ),
      ),
    );
  }

  void _usePapilioPlugin() async {
    try {
      // 假设这个方法存在,并返回一个Future
      var result = await Papilio.instance.performUnknownFunction();
      print('Result from Papilio: $result');
    } catch (e) {
      print('Error using Papilio: $e');
    }
  }
}

5. 错误处理

由于我们不知道插件的具体行为,添加适当的错误处理是非常重要的,如上例所示。

注意事项

  • 查阅文档:实际使用时,请查阅papilio插件的官方文档,了解其具体功能、方法和参数。
  • 示例代码:许多插件在pub.dev页面上会有示例代码,这可以作为使用的起点。
  • 版本兼容性:确保插件版本与Flutter SDK版本兼容。

由于papilio是一个假设的插件名称,上述代码需要根据实际插件的实现进行调整。如果papilio是一个真实存在的插件但功能未知,请参考其官方文档获取具体用法。

回到顶部