Flutter功能探索插件firefly的使用方法

Flutter功能探索插件firefly的使用


Firefly Package Logo

使用此方便的Firestore构建器小部件创建漂亮的Flutter小部件树。


额外信息

如果你使用VS Code,有一个名为Firefly Snippets的扩展可以用于Firefly!


####Flutter功能探索插件firefly 使用方法

开始使用Firefly有三个步骤。


设置Firebase

我们推荐遵循FlutterFire指南来设置你的应用与Firebase。

重要的是在使用任何Firefly小部件之前先设置Firebase。我们喜欢使用FutureBuilder来初始化Firebase。

Widget build(BuildContext context) {
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  return FutureBuilder(
    // 初始化FlutterFire:
    future: _initialization,
    builder: (context, snapshot) {
      // 检查错误
      if (snapshot.hasError) {
        return Text('出现了错误...');
      }

      // 初始化完成后显示您的应用程序
      if (snapshot.connectionState == ConnectionState.done) {
        return FireflyApp();
      }

      // 否则,在初始化完成之前显示一些内容
      return Text('加载中...');
    },
  );
}

使用FireflyProvider

FireflyProvider将提供所有Firefly小部件正确的Firestore数据库实例。它还需要一个FireflyDataBuilder列表。FireflyDataBuilder的目的是为Firefly提供正确的模型和构造函数,以便在各种构建器参数中创建对象之前,它可以创建您的对象。

class FireflyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final firestore = FirebaseFirestore.instance;

    final buildList = [
      FireflyDataBuilder(
        model: Person,
        builder: (json) => Person.fromJson(json),
      )
    ];

    return FireflyProvider(
      instance: firestore,
      modelbuilderList: buildList,
      child: App(),
    );
  }
}

最后,你可以使用Firefly

Firefly需要两个东西才能正常工作。 collection参数用于让Firefly知道从哪个Firestore集合检索数据。 类型对象在各种builder参数中预期被访问。这里我们期望一个Person,通过添加<Person>

然后我们可以使用builder来获取一个Person对象列表,这里描述为state

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Firefly<Person>(
          collection: 'persons',
          builder: (context, state) => ListView.builder(
            itemCount: state.length,
            itemBuilder: (context, index) => Text(state[index].name),
          ),
        ),
      ),
    );
  }
}

使用Firefly小部件

Firefly小部件有许多参数:


列表构建器

builder是一种检索创建对象的方式。但你也可以使用简写listBuilder来获取已经创建的ListView

Firefly<Person>(
  collection: 'persons',
  listBuilder: (context, state, index) => Text(state[index].name),
),

查询

你还可以直接在小部件上查询Firestore。使用query参数和Query模型。

import 'package:cloud_firestore/cloud_firestore.dart' hide Query;

Firefly<Person>(
  collection: 'persons',
  listBuilder: (context, state, index) => Text(state[index].name),
  queries: [Query('age')..isEqualTo(22)],
),

默认查询可以在FireflyProvider中定义。这些将在所有Firefly小部件的使用中应用。

FireflyProvider(
  defaultQueries: [Query('age')..isEqualTo(22)],
  instance: FirebaseFirestore.instance,
  modelbuilderList: [...],
  child: ...
),

覆盖加载状态

如果想在Firestore加载时显示另一个小部件,只需使用loading参数覆盖任何你喜欢的小部件。

Firefly<Person>(
  collection: 'players',
  listBuilder: (context, state, index) => Text(state[index].name),
  loading: Container(
    width: 200,
    height: 200,
    color: Colors.red,
  ),
),

处理错误

如果接收数据时出现错误,使用error参数处理它。

Firefly<Person>(
  collection: 'players',
  listBuilder: (context, state, index) => Text(state[index].name),
  error: (error) => Text(error.toString()),
),

完整示例Demo

以下是完整的示例代码,包括如何初始化Firebase,如何使用FireflyProvider,以及如何使用Firefly小部件。

import 'package:cloud_firestore/cloud_firestore.dart' hide Query;
import 'package:firebase_core/firebase_core.dart';
import 'package:firefly/firefly.dart';
import 'package:flutter/material.dart';

/// 创建匹配Firestore文档的模型。
class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  factory Person.fromJson(Map<String, dynamic> json) {
    return Person(json['name'], json['age']);
  }
}

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Setup(),
    );
  }
}

/// 确保在使用任何Firefly小部件之前初始化Firebase。
class Setup extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final Future<FirebaseApp> _initialization = Firebase.initializeApp();

    return FutureBuilder(
      future: _initialization,
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Text('出现了错误!');
        }

        if (snapshot.connectionState == ConnectionState.done) {
          final firestore = FirebaseFirestore.instance;

          /// [FireflyDataBuilder]需要模型和处理Json数据的构造函数。
          final buildList = [
            FireflyDataBuilder(
              model: Person,
              builder: (json) => Person.fromJson(json),
            )
          ];

          /// 一旦Firebase初始化完成,你需要用[FireflyProvider]包装你的应用。
          /// 它需要你的Firestore实例和创建对象以返回的[FireflyDataBuilders]列表。
          /// 如果你想在所有请求中使用查询,使用[defaultQueries]参数。
          return FireflyProvider(
            instance: firestore,
            modelbuilderList: buildList,
            child: App(),
          );
        }

        // 否则,在初始化完成之前显示一些内容
        return Text('加载中...');
      },
    );
  }
}

/// 然后可以在任何地方使用[Firefly]小部件。
/// 记得传递模型作为[Firefly<Model>]以便你知道在[builders]状态中期望什么。
/// 告诉Firefly你想要的集合,并在构建器回调中获取构造的数据列表。
class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Firefly<Person>(
          collection: 'persons',
          builder: (context, state) => ListView.builder(
            itemCount: state.length,
            itemBuilder: (context, index) => Text(state[index].name),
          ),
        ),
      ),
    );
  }
}

/// 或者你可以使用简写[listBuilder]来获取已经创建的[ListView]。
class ListBuilder extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Firefly<Person>(
          collection: 'players',
          listBuilder: (context, state, index) => Text(state[index].name),
        ),
      ),
    );
  }
}

/// 你也可以直接在小部件上查询Firestore。
/// 使用[queries]参数和[Query]模型。
/// 你可以链式调用多个查询。
class QueryFirestore extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Firefly<Person>(
          collection: 'players',
          listBuilder: (context, state, index) => Text(state[index].name),
          queries: [Query('age')..isEqualTo(22)],
        ),
      ),
    );
  }
}

/// 如果想在Firestore加载时显示另一个小部件,只需使用[loading]参数覆盖任何你喜欢的小部件。
class OverrideLoading extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Firefly<Person>(
          collection: 'players',
          listBuilder: (context, state, index) => Text(state[index].name),
          loading: Container(
            width: 200,
            height: 200,
            color: Colors.red,
          ),
        ),
      ),
    );
  }
}

/// 如果接收数据时出现错误,使用[error]参数处理它。
class HandleErrors extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Firefly<Person>(
          collection: 'players',
          listBuilder: (context, state, index) => Text(state[index].name),
          error: (error) => Text(error.toString()),
        ),
      ),
    );
  }
}

更多关于Flutter功能探索插件firefly的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能探索插件firefly的使用方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter社区中,插件通常是为了扩展Flutter应用的功能而开发的包。尽管“firefly”这个名称在Flutter的官方插件库中没有一个明确定义的插件,但基于名称推测,我们可以想象一个名为“firefly”的插件可能旨在提供某种形式的“点亮”或“可视化”功能,可能用于调试、UI效果展示或其他与光效相关的功能。

以下是一个假想的Flutter插件firefly的使用示例,这个示例展示了如何在一个Flutter应用中集成和使用一个假设的firefly插件来创建一些视觉效果。请注意,由于firefly插件实际上并不存在,下面的代码是基于假设的功能编写的,用于演示目的。

假设的firefly插件功能

  • 创建萤火虫效果:在屏幕上随机位置生成并移动的光点。
  • 控制光点的数量、颜色和速度

示例代码

首先,我们假设firefly插件已经作为一个包被添加到我们的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  firefly: ^0.1.0  # 假设的版本号

然后,在Dart代码中,我们可以这样使用它:

import 'package:flutter/material.dart';
import 'package:firefly/firefly.dart'; // 假设的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Firefly Demo'),
        ),
        body: Center(
          child: FireflyWidget(
            numFireflies: 50, // 萤火虫数量
            color: Colors.blue, // 萤火虫颜色
            speed: 2.0, // 萤火虫移动速度
          ),
        ),
      ),
    );
  }
}

// 假设的FireflyWidget,用于展示萤火虫效果
class FireflyWidget extends StatefulWidget {
  final int numFireflies;
  final Color color;
  final double speed;

  const FireflyWidget({
    Key? key,
    required this.numFireflies,
    required this.color,
    required this.speed,
  }) : super(key: key);

  @override
  _FireflyWidgetState createState() => _FireflyWidgetState();
}

class _FireflyWidgetState extends State<FireflyWidget> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 5),
      vsync: this,
    )..repeat(reverse: true);

    _animation = Tween<double>(begin: 0, end: 1).animate(_controller);

    // 假设的初始化firefly效果
    _initializeFireflies();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  // 假设的初始化方法,用于设置萤火虫效果
  void _initializeFireflies() {
    // 这里会调用假设的firefly插件的方法来初始化萤火虫效果
    // 例如:Firefly.initialize(context, numFireflies: widget.numFireflies, color: widget.color, speed: widget.speed);
    // 但由于这是假设的,所以我们仅打印一些信息来模拟
    print('Initializing ${widget.numFireflies} fireflies with color ${widget.color} and speed ${widget.speed}');
  }

  @override
  Widget build(BuildContext context) {
    // 假设的FireflyLayer用于渲染萤火虫效果
    // 例如:return FireflyLayer(animation: _animation);
    // 但由于这是假设的,所以我们仅返回一个占位的Container
    return Container(
      color: Colors.black,
      child: Center(
        child: Text('Firefly effect should be here (simulated)'),
      ),
    );
  }
}

注意事项

  1. 插件不存在:请记住,上面的代码是基于假设的firefly插件功能编写的。实际上,你需要找到一个真实的Flutter插件或自己实现所需的功能。
  2. 动画控制:在示例中,我们使用了AnimationController来控制动画,但实际的萤火虫效果可能需要更复杂的动画逻辑。
  3. 自定义绘制:如果firefly插件涉及到自定义绘制,你可能需要使用CustomPainter来绘制萤火虫效果。

希望这个示例能帮助你理解如何在Flutter中集成和使用一个假设的插件,并激发你对Flutter插件开发的兴趣。如果你正在寻找一个实际的插件来实现类似的功能,你可能需要在Flutter的社区、Pub仓库或其他资源中搜索。

回到顶部