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
更多关于Flutter异步数据获取与UI构建插件get_it_future_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,异步数据获取与 UI 构建是一个常见的需求。get_it_future_builder
是一个基于 get_it
和 FutureBuilder
的插件,它可以帮助你更简洁地处理异步数据获取并将其与 UI 构建结合起来。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 get_it
和 get_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);
}
},
),
),
),
);
}
}