Flutter异步数据获取与UI构建插件get_it_future_builder的使用

Flutter异步数据获取与UI构建插件get_it_future_builder的使用

get_it_future_builder 提供了一个名为 GetItFutureBuilder 的小部件,用于在展示层等待您的异步依赖项准备就绪。

安装 💻

要开始使用 Get It Future Builder,必须在您的机器上安装 Flutter SDK

pubspec.yaml 文件中添加 get_it_future_builder

dependencies:
  get_it_future_builder:

然后运行以下命令来安装它:

flutter packages get

如何使用它

单个依赖项

您可以查看 示例目录

通过 GetIt 注册您的异步依赖项:

GetIt.I.registerSingletonAsync<Directory>(
  () async {
    return await getApplicationDocumentsDirectory();
  },
  instanceName: 'documents_dir', // 可选参数
);

在这个例子中,我们将使用 path_provider 包中的 getApplicationDocumentsDirectory 方法。由于它通过 MethodChannel 调用原生代码,因此它是异步的。

在展示层,您可以这样使用:

// 注意我们如何使用泛型来获取依赖项
GetItFutureBuilder<Directory>(
  // 可选参数
  instanceName: 'documentsDir',
  // 在加载时渲染此小部件
  loading: (context) => LinearProgressIndicator(),
  // 准备完成后渲染此小部件
  ready: (context, instance) => Text('documents dir is: ${instance.path}'),
)
多个依赖项

get_it_future_builder 支持最多三个依赖项的初始化小部件。这些小部件分别命名为:

  • GetItFutureBuilder2
  • GetItFutureBuilder3

要在一个小部件树中初始化两个依赖项,请使用 GetItFutureBuilder2

假设我们有两个异步依赖项:

GetIt.I.registerSingletonAsync<Directory>(
  () async {
    return await getApplicationDocumentsDirectory();
  },
  instanceName: 'documents_dir', // 可选参数
);

GetIt.I.registerSingletonAsync<Directory>(
  () async {
    return await getTemporaryDirectory();
  },
  instanceName: 'temp_dir', // 可选参数
);

要异步初始化它们,请使用 GetItFutureBuilder2

GetItFutureBuilder2<Directory, Directory>(
  instanceName1: 'documents_dir', // 可选参数
  instanceName2: 'temp_dir', // 可选参数
  loading: (context) => const LinearProgressIndicator(),
  ready: (context, instance1, instance2) => Text(
    'Documents dir is ${instance1.path} and temp dir is ${instance2.path}',
  ),
),

依赖项的初始化是并发进行的。

不同的服务定位器

默认情况下,GetItFutureBuilder 使用全局服务定位器 GetIt.I(或 GetIt.instance)来解析依赖项。如果您已经初始化了不同的服务定位器,可以通过以下方式传递给 GetItFutureBuilder

GetItFutureBuilder(
  // ...
  locator: myLocator,
  // ...
)

完整示例代码

下面是完整的示例代码:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:get_it_future_builder/get_it_future_builder.dart';
import 'package:get_it_future_builder_example/locators.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Get It Future Builder Example'),
        elevation: 4,
        centerTitle: true,
      ),
      body: ListView(
        padding: const EdgeInsets.all(16),
        children: [
          // 单个future builder示例
          Column(
            children: [
              Text(
                'Application Documents Directory',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
              const SizedBox(height: 8),
              GetItFutureBuilder<Directory>(
                instanceName: 'documents_dir', // 可选参数
                loading: (context) => const LinearProgressIndicator(),
                ready: (context, instance) => Text(
                  'Documents directory: ${instance.path}',
                  textAlign: TextAlign.center,
                ),
              ),
            ],
          ),
          // 两个依赖项的future builder示例
          Column(
            children: [
              Text(
                'Two Dependencies',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
              const SizedBox(height: 8),
              GetItFutureBuilder2<Directory, Directory>(
                instanceName1: 'temp_dir', // 可选参数
                instanceName2: 'support_dir', // 可选参数
                loading: (context) => const LinearProgressIndicator(),
                ready: (context, instance1, instance2) => Text(
                  'Temporary dir is ${instance1.path} and support dir is '
                  '${instance2.path}.',
                  textAlign: TextAlign.center,
                ),
              ),
            ],
          ),
          // 三个依赖项的future builder示例
          Column(
            children: [
              Text(
                'Three Depenencies',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
              const SizedBox(height: 8),
              GetItFutureBuilder3<Directory, Directory, Directory>(
                instanceName1: 'temp_dir', // 可选参数
                instanceName2: 'support_dir', // 可选参数
                instanceName3: 'documents_dir',
                loading: (context) => const LinearProgressIndicator(),
                ready: (context, instance1, instance2, instance3) => Text(
                  'Temporary dir is ${instance1.path}, support dir is '
                  '${instance2.path} and documents dir is ${instance3.path}.',
                  textAlign: TextAlign.center,
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

更多关于Flutter异步数据获取与UI构建插件get_it_future_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异步数据获取与UI构建插件get_it_future_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,异步数据获取与 UI 构建是一个常见的需求。get_it_future_builder 是一个基于 get_itFutureBuilder 的插件,它可以帮助你更简洁地处理异步数据获取并将其与 UI 构建结合起来。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  get_it: ^7.2.0
  get_it_future_builder: ^1.0.0

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

2. 设置 GetIt

GetIt 是一个服务定位器,用于依赖注入。你需要在应用的启动阶段注册你的服务或数据获取函数。

import 'package:get_it/get_it.dart';

final getIt = GetIt.instance;

void setup() {
  // 注册一个异步数据获取函数
  getIt.registerFactoryAsync<MyData>(() async {
    await Future.delayed(Duration(seconds: 2)); // 模拟网络请求
    return MyData();
  });
}

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

3. 使用 GetItFutureBuilder

GetItFutureBuilder 是一个特殊的 FutureBuilder,它可以直接从 GetIt 中获取异步数据并构建 UI。

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

class MyData {
  final String message = "Hello from async data!";
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('GetItFutureBuilder Example')),
        body: Center(
          child: GetItFutureBuilder<MyData>(
            future: getIt.getAsync<MyData>(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Text(snapshot.data!.message);
              }
            },
          ),
        ),
      ),
    );
  }
}
回到顶部