Flutter数据共享插件shared_provider的使用

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

Flutter数据共享插件shared_provider的使用

描述

SharedProvider 是 Flutter 中 provider 功能的一个扩展,它允许管理共享实例(如状态对象或服务)。它解决了在不同屏幕之间高效复用实例的问题,同时避免了不必要的内存负载和复杂的导航逻辑。

解决方案

SharedProvider 提供以下功能:

  • 集中存储库:实现一个存储库来存储共享实例,以便提供者可以方便地访问它们。
  • 实例复用:提供者会检查存储库中是否存在所需实例,如果存在则重用该实例。如果不存在,则创建新实例并添加到存储库中。
  • 生命周期管理:当实例不再被使用时,提供者会自动从存储库中移除这些实例。

这些改进使得资源使用更加高效,并简化了应用中共享实例的处理。

使用方法

以下是如何在您的 Flutter 应用程序中使用 SharedProvider 的示例。在这个示例中,我们有两个屏幕 ScreenAScreenB,并在它们之间共享一个字符串实例。

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_provider/shared_provider.dart';

const sharedInstanceKey = 'shared_value';

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

final _router = GoRouter(
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => const MyHomePage(),
    ),
    GoRoute(
      path: '/a',
      builder: (context, state) => const ScreenA(),
    ),
    GoRoute(
      path: '/b',
      builder: (context, state) => const ScreenB(),
    ),
  ],
);

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: _router,
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Home'),
      ),
      body: const Placeholder(),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.push('/a'),
        tooltip: 'to Screen A',
        child: const Text('to A'),
      ),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('ScreenA'),
      ),
      body: Center(
        child: SharedProvider(
          create: (_) => 'This text was created on screen [A]',
          dispose: (context, value) {
            print('dispose on screen A:\nshared value => $value');
          },
          instanceKey: sharedInstanceKey,
          child: Consumer<String>(builder: (context, value, child) {
            return Text(value);
          }),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.push('/b'),
        tooltip: 'to Screen B',
        child: const Text('to B'),
      ),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('ScreenB'),
      ),
      body: Center(
        child: SharedProvider(
          create: (_) => 'This text was created on screen [B]',
          dispose: (context, value) {
            print('dispose on screen B:\nshared value => $value');
          },
          instanceKey: sharedInstanceKey,
          child: Consumer<String>(builder: (context, value, child) {
            return Text(value);
          }),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.go('/'),
        tooltip: 'to Home',
        child: const Text('to Home'),
      ),
    );
  }
}

更多关于Flutter数据共享插件shared_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据共享插件shared_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用shared_preferences插件进行数据共享的一个示例。虽然你提到的是shared_provider,但通常大家更熟悉和使用的是shared_preferences,这是一个广泛使用的Flutter插件,用于在本地存储简单的键值对数据。

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

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15  # 请检查最新版本号

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

接下来,是一个完整的示例,展示如何使用shared_preferences来存储和检索数据:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SharedPreferences Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SharedPreferencesDemo(),
    );
  }
}

class SharedPreferencesDemo extends StatefulWidget {
  @override
  _SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}

class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  late SharedPreferences _preferences;
  String? _savedValue;

  @override
  void initState() {
    super.initState();
    _loadPreferences();
  }

  Future<void> _loadPreferences() async {
    _preferences = await SharedPreferences.getInstance();
    setState(() {
      _savedValue = _preferences.getString('my_key');
    });
  }

  Future<void> _saveValue(String value) async {
    setState(() {
      _preferences.setString('my_key', value);
      _savedValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              'Saved Value:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 8),
            Text(
              _savedValue ?? 'No value saved yet',
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 24),
            TextField(
              decoration: InputDecoration(labelText: 'Enter a value'),
              onChanged: (value) {
                // You could also save the value here on every change if needed
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                final TextField textField = FocusScope.of(context).focusedChild as TextField?;
                String? newValue = textField?.controller?.text;
                if (newValue != null) {
                  await _saveValue(newValue);
                }
              },
              child: Text('Save Value'),
            ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖安装

    • pubspec.yaml中添加shared_preferences依赖。
  2. 主应用结构

    • MyApp是一个StatelessWidget,它创建了MaterialApp并设置了主页为SharedPreferencesDemo
  3. 状态管理

    • SharedPreferencesDemo是一个StatefulWidget,它有一个状态类_SharedPreferencesDemoState
  4. 加载偏好设置

    • initState中调用_loadPreferences方法来异步获取SharedPreferences实例,并加载已保存的值。
  5. 保存值

    • _saveValue方法用于将值保存到SharedPreferences中,并更新UI。
  6. UI构建

    • 使用ScaffoldColumnTextTextFieldElevatedButton构建UI。
    • 当按钮被点击时,从TextField获取文本并调用_saveValue方法保存它。

这样,你就可以在Flutter应用中通过shared_preferences实现数据的本地存储和检索了。如果你确实是指一个名为shared_provider的特定插件,请提供更多的上下文或链接,以便给出更准确的指导。

回到顶部