Flutter网格布局插件apptive_grid_grid_builder的使用

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

Flutter网格布局插件 apptive_grid_grid_builder 的使用

apptive_grid_grid_builder 是一个用于基于网格数据构建Widget的Flutter插件。本文将详细介绍如何在你的Flutter项目中使用该插件,并提供一个完整的示例。

插件信息

主要功能

该插件允许你通过ApptiveGrid提供的API轻松地从网格数据中构建UI组件。

使用方法

1. 初始化ApptiveGrid

为了使用任何ApptiveGrid的功能,必须用一个ApptiveGrid Widget包装你的应用程序:

import 'package:apptive_grid_core/apptive_grid_core.dart';

void main() {
  runApp(
    ApptiveGrid(
      options: ApptiveGridOptions(
        authenticationOptions: ApptiveGridAuthenticationOptions(
          autoAuthenticate: true,
        ),
      ),
      child: MyApp(),
    ),
  );
}

2. 使用ApptiveGridGridBuilder

接下来,在需要展示网格数据的地方添加ApptiveGridGridBuilder

body: ApptiveGridGridBuilder(
  uri: Uri.parse('LINK_TO_GRID'),
  builder: (context, snapshot) {
    if (snapshot.hasError) {
      return Center(child: Text('Error: ${snapshot.error}'));
    } else if (!snapshot.hasData) {
      return const Center(child: CircularProgressIndicator());
    } else {
      return ListView.builder(
        itemCount: snapshot.data!.rows?.length ?? 0,
        itemBuilder: (context, index) {
          final row = snapshot.data!.rows![index];
          return ListTile(
            title: Text(row.entries[1].data.schemaValue),
            subtitle: Text(row.entries[0].data.value.toString()),
          );
        },
      );
    }
  },
),

认证

自动认证

你可以设置autoAuthenticatetrue来自动触发认证过程:

authenticationOptions: ApptiveGridAuthenticationOptions(
  autoAuthenticate: true,
),

API Key认证

如果你希望通过API Key进行认证,可以在ApptiveGridAuthenticationOptions中添加ApptiveGridApiKey

authenticationOptions: ApptiveGridAuthenticationOptions(
  autoAuthenticate: true,
  apiKey: ApptiveGridApiKey(
    authKey: 'YOUR_AUTH_KEY',
    password: 'YOUR_AUTH_KEY_PASSWORD',
  ),
),

完整示例

以下是一个完整的示例,展示了如何在Flutter应用中集成并使用apptive_grid_grid_builder插件:

// ignore_for_file: public_member_api_docs

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

void main() async {
  await enableWebAuth(const ApptiveGridOptions());
  runApp(
    ApptiveGrid(
      options: const ApptiveGridOptions(
        environment: ApptiveGridEnvironment.alpha,
        authenticationOptions: ApptiveGridAuthenticationOptions(
          autoAuthenticate: true,
          apiKey: ApptiveGridApiKey(
            authKey: 'YOUR_AUTH_KEY',
            password: 'YOUR_AUTH_KEY_PASSWORD',
          ),
        ),
      ),
      child: MyApp(),
    ),
  );
}

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

class _MyHomePage extends StatefulWidget {
  const _MyHomePage();

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

class _MyHomePageState extends State<_MyHomePage> {
  final GlobalKey<ApptiveGridGridBuilderState> _builderKey = GlobalKey();

  List<ApptiveGridSorting>? _sorting;

  SortOrder _order = SortOrder.asc;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Grid Builder'),
        actions: [
          IconButton(
            onPressed: () {
              late final SortOrder newOrder;
              if (_order == SortOrder.asc) {
                newOrder = SortOrder.desc;
              } else {
                newOrder = SortOrder.asc;
              }
              setState(() {
                if (_sorting != null) {
                  _sorting = [_sorting!.first.copyWith(order: newOrder)];
                  _order = newOrder;
                }
              });
            },
            icon: Icon(
              _order == SortOrder.asc ? Icons.arrow_drop_up : Icons.arrow_drop_down,
            ),
          ),
        ],
      ),
      body: ApptiveGridGridBuilder(
        key: _builderKey,
        uri: Uri.parse('/api/users/USER_ID/spaces/SPACE_ID/grids/GRID_ID'),
        sorting: _sorting,
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return Center(child: Text('Error: ${snapshot.error}'));
          } else if (!snapshot.hasData) {
            return const Center(child: CircularProgressIndicator());
          } else {
            if (_sorting == null) {
              WidgetsBinding.instance.addPostFrameCallback((_) {
                late final ApptiveGridSorting newSorting;
                if (snapshot.data!.fields?.first.type == DataType.geolocation) {
                  newSorting = DistanceApptiveGridSorting(
                    fieldId: snapshot.data!.fields!.first.id,
                    order: _order,
                    location: const Geolocation(latitude: 50.938757, longitude: 6.954399),
                  );
                } else {
                  newSorting = ApptiveGridSorting(fieldId: snapshot.data!.fields!.first.id, order: _order);
                }
                setState(() {
                  _sorting = [newSorting];
                });
              });
            }
            return RefreshIndicator(
              onRefresh: () => _builderKey.currentState?.reload() ?? Future.value(),
              child: ListView.separated(
                itemCount: snapshot.data!.rows?.length ?? 0,
                separatorBuilder: (context, index) => const Divider(),
                itemBuilder: (context, index) {
                  final row = snapshot.data!.rows![index];
                  return ListTile(
                    title: Text(row.entries[1].data.schemaValue),
                    subtitle: Text(row.entries[0].data.value.toString()),
                  );
                },
              ),
            );
          }
        },
      ),
    );
  }
}

更多关于Flutter网格布局插件apptive_grid_grid_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网格布局插件apptive_grid_grid_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用apttive_grid_view插件来创建网格布局的示例代码。这个插件提供了GridViewBuilder,可以方便地创建动态网格布局。

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

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

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

接下来是一个示例代码,展示如何使用GridViewBuilder来创建一个简单的网格布局:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Grid Layout Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final List<String> items = List.generate(50, (index) => "Item $index");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GridViewBuilder Demo'),
      ),
      body: GridViewBuilder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2, // 网格的列数
          crossAxisSpacing: 4.0, // 列间距
          mainAxisSpacing: 4.0, // 行间距
        ),
        itemCount: items.length,
        itemBuilder: (context, index) {
          return Card(
            child: Center(
              child: Text(items[index]),
            ),
          );
        },
      ),
    );
  }
}

代码解释:

  1. 依赖导入

    • 导入flutter/material.dart用于基本的Material Design组件。
    • 导入apptive_grid_view/apptive_grid_view.dart用于GridViewBuilder
  2. 应用入口

    • MyApp是应用的入口,包含一个MaterialApp,并设置主题和主页。
  3. 主页布局

    • MyHomePage是一个无状态小部件,包含一个Scaffold,包含应用栏和主体内容。
    • 在主体内容中,使用GridViewBuilder来创建网格布局。
  4. GridViewBuilder

    • gridDelegate定义了网格的布局方式,这里使用SliverGridDelegateWithFixedCrossAxisCount,表示网格的列数是固定的。
    • crossAxisCount指定了列数。
    • crossAxisSpacingmainAxisSpacing分别指定了列间距和行间距。
    • itemCount指定了网格中的项目数量。
    • itemBuilder是一个构建器函数,用于为每个网格项生成内容。这里简单地使用Card包裹一个Center和一个Text小部件。

通过这种方式,你可以轻松地在Flutter应用中创建响应式网格布局。如果需要更复杂的布局,可以进一步调整gridDelegate的参数或自定义itemBuilder中的内容。

回到顶部