Flutter海洋相关功能插件marine的使用

本文将介绍如何使用 marine 插件来实现一个具有分页功能的可动画网格视图。marine 是一个用于构建复杂用户界面的插件,特别适用于需要动态添加或删除项目的场景。

特性

  • 动画网格视图:支持网格项的动画效果。
  • 分页功能:通过滚动加载更多数据。
  • 轻松操作网格项:可以轻松弹出或返回网格项。

使用方法

1. 添加依赖

pubspec.yaml 文件中添加 marine 依赖:

dependencies:
  marine: ^版本号

然后运行以下命令安装依赖:

flutter pub get

2. 初始化 GridController

首先,创建一个 GridController 实例,并传入一个用于获取分页数据的函数。

GridController gridController = GridController(pageFetcher: fetchList);

3. 构建 PagedGrid

使用 PagedGrid 小部件来显示网格视图,并设置网格项的生成器。

PagedGrid(
  maxCrossAxisExtent: 200, // 每个网格项的最大宽度
  childAspectRatio: 1.8, // 网格项的宽高比
  gridController: gridController,
  itemBuilder: (BuildContext context, dynamic item, int index) {
    Widget row = itemView(index: index, data: item);
    return row;
  },
)

完整示例代码

import 'dart:math';

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Paged Grid',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Paged Grid Example'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ScrollController scrollController = ScrollController();
  late GridController gridController;

  [@override](/user/override)
  void initState() {
    super.initState();
    gridController = GridController(pageFetcher: fetchList);
    gridController.fetchPage();
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    gridController.dispose();
    scrollController.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: CustomScrollView(
          controller: scrollController,
          slivers: [
            const SliverToBoxAdapter(
              child: SizedBox(height: 150, child: Text("Paged grid view Example")),
            ),
            SliverToBoxAdapter(
              child: TextDivider(child: const Text('Divider')),
            ),
            pagedGrid,
          ],
        ),
      ),
      floatingActionButton: floatingButton,
    );
  }

  Widget get pagedGrid {
    return PagedGrid(
      maxCrossAxisExtent: 200,
      childAspectRatio: 1.8,
      gridController: gridController,
      itemBuilder: (BuildContext context, dynamic item, int index) {
        Widget row = itemView(index: index, data: item);
        return row;
      },
    );
  }

  Widget itemView(
      {int index = 0, bool standlone = false, bool isAdd: false, dynamic data}) {
    Widget result = Container(
      alignment: Alignment.center,
      width: 200,
      height: 200,
      child: Card(
        child: Column(
          children: [
            Row(
              children: [
                const Text("index"),
                const SizedBox(width: 10),
                Text("$index")
              ],
            ),
            Row(
              children: [
                const Text("data"),
                const SizedBox(width: 10),
                Text("${data['data'] ?? 'unk'}")
              ],
            ),
            if (!standlone)
              TextButton.icon(
                onPressed: () {
                  gridController.showItem(
                    data: data,
                    item: itemView(index: index, standlone: true, data: data),
                    context: context,
                  );
                },
                icon: const Icon(Icons.more_horiz),
                label: const Text("DETAIL"),
              ),
            if (standlone)
              Row(
                children: [
                  TextButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: const Text("BACK"),
                  ),
                  TextButton(
                    onPressed: () {
                      Navigator.pop(context);
                      gridController.deleteItem(data: data);
                    },
                    child: const Text("DELETE"),
                  ),
                ],
              ),
            if (isAdd)
              TextButton(
                onPressed: () {
                  gridController.addItem({"data": "new"});
                  Navigator.pop(context);
                },
                child: const Text("ADD"),
              ),
          ],
        ),
      ),
    );
    return result;
  }

  Future<List<dynamic>> fetchList() async {
    if (gridController.items.value.length > 100) return [];
    var ran = Random();
    List<dynamic> items = [];
    for (int i = 0; i < 2; i++) {
      Map<String, dynamic> item = {"data": ran.nextInt(10000)};
      items.add(item);
    }
    await Future.delayed(const Duration(milliseconds: 500));
    return items;
  }

  Widget get floatingButton {
    return Align(
      alignment: const Alignment(1, 1),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          SizedBox(
            height: 40,
            width: 40,
            child: FloatingActionButton(
              heroTag: -1,
              onPressed: () {
                gridController.showItem(
                  data: {},
                  item: itemView(index: -1, standlone: true, isAdd: true, data: {}),
                  context: context,
                );
              },
              child: const Icon(Icons.add),
            ),
          ),
          const SizedBox(
            height: 10,
          ),
          SizedBox(
            height: 40,
            width: 40,
            child: FloatingActionButton(
              heroTag: null,
              onPressed: () {
                scrollController.animateTo(
                  0,
                  duration: const Duration(milliseconds: 500),
                  curve: Curves.easeOut,
                );
              },
              child: const Icon(Icons.arrow_upward),
            ),
          ),
          const SizedBox(
            height: 10,
          ),
          SizedBox(
            height: 40,
            width: 40,
            child: FloatingActionButton(
              heroTag: null,
              onPressed: () {
                gridController.refresh();
              },
              child: const Icon(Icons.refresh),
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter海洋相关功能插件marine的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter海洋相关功能插件marine的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


marine 是一个用于 Flutter 的插件,它提供了与海洋相关的功能,例如获取海洋数据、海洋天气预报、潮汐信息等。这个插件可以帮助开发者轻松地将海洋相关的功能集成到他们的 Flutter 应用中。

安装 marine 插件

首先,你需要在 pubspec.yaml 文件中添加 marine 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  marine: ^1.0.0  # 请使用最新版本

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

使用 marine 插件

以下是一些常见的使用示例:

1. 获取海洋天气预报

import 'package:marine/marine.dart';

void getMarineWeather() async {
  try {
    MarineWeather weather = await Marine.getWeather(latitude: 37.7749, longitude: -122.4194);
    print('Temperature: ${weather.temperature}°C');
    print('Wind Speed: ${weather.windSpeed} m/s');
    print('Wave Height: ${weather.waveHeight} m');
  } catch (e) {
    print('Failed to get marine weather: $e');
  }
}

2. 获取潮汐信息

import 'package:marine/marine.dart';

void getTideInfo() async {
  try {
    TideInfo tide = await Marine.getTideInfo(latitude: 37.7749, longitude: -122.4194);
    print('High Tide: ${tide.highTide}');
    print('Low Tide: ${tide.lowTide}');
  } catch (e) {
    print('Failed to get tide info: $e');
  }
}

3. 获取海洋数据

import 'package:marine/marine.dart';

void getMarineData() async {
  try {
    MarineData data = await Marine.getData(latitude: 37.7749, longitude: -122.4194);
    print('Salinity: ${data.salinity} PSU');
    print('Temperature: ${data.temperature}°C');
    print('Current Speed: ${data.currentSpeed} m/s');
  } catch (e) {
    print('Failed to get marine data: $e');
  }
}
回到顶部