Flutter加载状态管理插件loading_provider的使用

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

Flutter加载状态管理插件loading_provider的使用

loading_provider 是一个用于在Flutter应用中轻松显示加载覆盖层(loading overlays)的插件,并且支持自定义配置。以下是详细的使用方法和示例代码。

安装

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

dependencies:
  flutter:
    sdk: flutter
  loading_provider: ^latest_version

记得替换 ^latest_version 为实际的最新版本号。

使用步骤

1. 导入包

在需要使用的文件中导入 loading_provider 包:

import 'package:loading_provider/loading_provider.dart';

2. 包裹根组件

将你的 MaterialApp 或根组件包裹在 LoadingProvider 中,以初始化加载管理器并提供全局的加载配置:

void main() {
  runApp(
    LoadingProvider(
      appBuilder: (context, builder) => MaterialApp(
        home: const Home(),
        builder: builder,
      ),
      loadings: {  
        'loading1': LoadingConfig(
          backgroundColor: Colors.blue.withOpacity(0.5),
          widget: const Text('Loading'),
        ),
        // 可以添加更多的加载配置
      },
    ),
  );
}

3. 显示加载覆盖层

使用 LoadingBuilder

通过 LoadingBuilder 小部件来显示加载覆盖层:

LoadingBuilder(
  config: const LoadingConfig(), 
  builder: (context, setLoading) {
    return ElevatedButton(
      onPressed: () async {
        setLoading(true); 
        await Future.delayed(Duration(seconds: 2));
        setLoading(false); 
      },
      child: Text('Show Loading'),
    );
  },
);

使用 LoadingWidget

也可以直接使用 LoadingWidget 来显示加载覆盖层:

LoadingWidget(
  isLoading: true,
  config: const LoadingConfig(), 
  child: Text('Loading...'),
);

使用 LoadingController

另外一种方式是通过 LoadingController 控制加载显示:

ElevatedButton(
  onPressed: () async {
    var loading = context.loadingController;
    loading.on(); 
    await Future.delayed(const Duration(seconds: 3));
    loading.off(); 
    loading.on('loading1'); 
    await Future.delayed(const Duration(seconds: 3));
    loading.off(); 
  },
  child: const Text('Loading'),
),

4. 自定义加载样式

你可以通过 LoadingConfig 对象来自定义加载覆盖层的样式:

LoadingConfig(
  backgroundColor: Colors.blue.withAlpha(128),
  widget: CircularProgressIndicator(
    valueColor: AlwaysStoppedAnimation(Colors.white),
  ),
)

示例Demo

以下是一个完整的示例应用,展示了如何使用 loading_provider 插件:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return LoadingProvider(
      appBuilder: (context, builder) => MaterialApp(
        home: const Home(),
        builder: builder,
      ),
      loadings: {
        'load1': LoadingConfig(
          backgroundColor: Theme.of(context).colorScheme.primaryContainer.withOpacity(0.5),
          widget: const Text('Loading'),
        ),
      },
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Text('Hello World!'),
            ElevatedButton(
              onPressed: () async {
                var loading = context.loadingController..on();
                await Future.delayed(const Duration(seconds: 3));
                loading.off();
              },
              child: const Text('Loading'),
            ),
            const Center(
              child: SizedBox(
                height: 100,
                child: LoadingWidget(
                  isLoading: true,
                  child: Text('Loading 1'),
                ),
              ),
            ),
            Center(
              child: SizedBox(
                height: 100,
                child: LoadingBuilder(
                  builder: (context, setLoading) {
                    return ElevatedButton(
                      onPressed: () async {
                        setLoading(true);
                        await Future.delayed(const Duration(seconds: 2));
                        setLoading(false);
                      },
                      child: const Text('Loading 2'),
                    );
                  },
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter加载状态管理插件loading_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加载状态管理插件loading_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用loading_provider插件来进行加载状态管理的代码示例。

1. 添加依赖

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

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

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

2. 创建一个LoadingProvider

在你的项目中,你需要创建一个LoadingProvider来管理加载状态。这通常在你的应用的主文件中完成,比如main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:loading_provider/loading_provider.dart';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => LoadingProvider(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Loading Provider Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

3. 使用LoadingProvider

在你的页面或组件中,你可以通过ConsumerSelector来访问和监听LoadingProvider的状态。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:loading_provider/loading_provider.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final loadingProvider = Provider.of<LoadingProvider>(context);

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () async {
            loadingProvider.showLoading();
            await Future.delayed(Duration(seconds: 2)); // 模拟异步操作
            loadingProvider.hideLoading();
          },
          child: Text('Show Loading'),
        ),
        if (loadingProvider.isLoading)
          CircularProgressIndicator(),
        else
          Text('Loading State: ${loadingProvider.isLoading ? 'Loading' : 'Not Loading'}'),
      ],
    );
  }
}

4. LoadingProvider 类

通常情况下,LoadingProvider类会是这样定义的:

import 'package:loading_provider/loading_provider.dart';

class LoadingProvider extends LoadingNotifier {
  // 这里可以添加自定义的逻辑,如果有需要的话
}

注意,LoadingNotifierloading_provider插件提供的一个基础类,它已经包含了加载状态管理的核心功能。

总结

以上代码展示了如何在Flutter项目中集成和使用loading_provider插件来管理加载状态。通过LoadingProvider,你可以轻松地控制加载指示器的显示和隐藏,从而提升用户体验。记得替换loading_provider的版本号为最新版本,以确保功能正常。

回到顶部