Flutter状态持久化插件state_persistence的使用

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

Flutter状态持久化插件 state_persistence 的使用

state_persistence 是一个用于在Flutter应用中实现状态持久化的插件。它允许开发者将应用的状态保存到本地文件(默认为data.json),并在应用重新启动时恢复这些状态。此外,该插件还支持自定义存储机制,例如使用shared_preferencessqflite

插件特性

  • 默认情况下,状态会以JSON格式存储在应用的数据目录中的data.json文件中。
  • 支持自定义存储机制,可以通过继承PersistedStateStorage类来实现。
  • 提供了PersistedAppStatePersistedStateBuilder两个核心组件,用于管理状态的持久化和读取。

示例代码

以下是一个完整的示例,展示了如何使用state_persistence插件来实现文本输入框内容的持久化:

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

void main() => runApp(App());

class App extends StatefulWidget {
  [@override](/user/override)
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  TextEditingController _textController;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return PersistedAppState(
      storage: JsonFileStorage(),
      child: MaterialApp(
        title: 'Persistent TextField Example',
        theme: ThemeData(primarySwatch: Colors.indigo),
        home: Scaffold(
          appBar: AppBar(title: Text('Persistent TextField Example')),
          body: Container(
            padding: const EdgeInsets.all(32.0),
            alignment: Alignment.center,
            child: PersistedStateBuilder(
              builder: (BuildContext context, AsyncSnapshot<PersistedData> snapshot) {
                if (snapshot.hasData) {
                  if (_textController == null) {
                    _textController = TextEditingController(text: snapshot.data['text'] ?? '');
                  }
                  return TextField(
                    controller: _textController,
                    decoration: InputDecoration(
                      hintText: 'Enter some text',
                    ),
                    onChanged: (String value) => snapshot.data['text'] = value,
                  );
                } else {
                  return CircularProgressIndicator();
                }
              },
            ),
          ),
        ),
      ),
    );
  }
}

解释

  1. PersistedAppState: 这是整个应用的状态容器,它负责管理状态的持久化。通过storage参数可以指定不同的存储机制,默认是JsonFileStorage

  2. PersistedStateBuilder: 类似于Flutter的FutureBuilder,它根据当前的状态数据构建UI。如果状态数据尚未加载完成,则显示加载指示器。

  3. TextEditingController: 用于控制文本输入框的内容,并将其与持久化状态同步。

另一个示例:Tab栏状态持久化

下面是一个更复杂的示例,展示如何使用state_persistence插件来保持Tab栏的选择状态:

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

void main() => runApp(App());

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return PersistedAppState(
      storage: JsonFileStorage(initialData: {
        'tab': 1,
      }),
      child: MaterialApp(
        title: 'Persistent Tab Example',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: ExampleScreen1(),
      ),
    );
  }
}

class ExampleScreen1 extends StatefulWidget {
  [@override](/user/override)
  _ExampleScreen1State createState() => _ExampleScreen1State();
}

class _ExampleScreen1State extends State<ExampleScreen1> with SingleTickerProviderStateMixin {
  PersistedData? _data;
  TabController? _controller;

  [@override](/user/override)
  void didChangeDependencies() {
    super.didChangeDependencies();
    final data = _data = PersistedAppState.of(context);
    if (data != null && _controller == null) {
      _controller = TabController(initialIndex: data['tab'] ?? 0, vsync: this, length: 4);
      _controller!.addListener(_onTabChanged);
    }
  }

  void _onTabChanged() {
    if (!_controller!.indexIsChanging) {
      _data!['tab'] = _controller!.index;
    }
  }

  [@override](/user/override)
  void dispose() {
    _controller?.removeListener(_onTabChanged);
    _controller?.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    if (_data != null) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Persistent Tab Example'),
          bottom: TabBar(
            controller: _controller,
            tabs: [
              Tab(text: 'First'),
              Tab(text: 'Second'),
              Tab(text: 'Third'),
              Tab(text: 'Forth'),
            ],
          ),
        ),
        body: TabBarView(
          controller: _controller,
          children: [
            Center(child: Text('Tab 1')),
            Center(child: Text('Tab 2')),
            Center(child: Text('Tab 3')),
            Center(child: Text('Tab 4')),
          ],
        ),
      );
    } else {
      return Center(child: CircularProgressIndicator());
    }
  }
}

更多关于Flutter状态持久化插件state_persistence的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态持久化插件state_persistence的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用state_persistence插件进行状态持久化的示例代码。state_persistence插件可以帮助你轻松地将Flutter应用的状态保存到本地存储(如磁盘),并在应用重新启动时恢复这些状态。

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

dependencies:
  flutter:
    sdk: flutter
  state_persistence: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用state_persistence插件:

  1. 初始化插件

在你的应用的主入口文件(通常是main.dart)中,初始化StatePersistence

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化StatePersistence
  StatePersistence.initialize(
    storage: FileStorage(directory: (await getApplicationDocumentsDirectory()).path),
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}
  1. 创建持久化状态模型

创建一个可持久化的数据模型,该模型需要实现Persistable接口。

import 'package:state_persistence/state_persistence.dart';

class CounterState implements Persistable {
  int count = 0;

  @override
  Map<String, dynamic> toMap() {
    return {'count': count};
  }

  @override
  void fromMap(Map<String, dynamic> map) {
    count = map['count'] as int ?? 0;
  }
}
  1. 在Widget中使用持久化状态

使用PersistedState包装你的状态,并将其传递给需要它的Widget。

import 'package:flutter/material.dart';
import 'package:state_persistence/state_persistence.dart';
import 'counter_state.dart';  // 假设你的CounterState模型在counter_state.dart文件中

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final counterState = PersistedState<CounterState>(
    key: 'counterState',
    defaultState: CounterState(),
  );

  void increment() {
    setState(() {
      counterState.value.count += 1;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('State Persistence Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counterState.value.count}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: increment,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

在上面的代码中,PersistedState负责将CounterState的状态持久化到本地存储,并在应用重启时恢复该状态。

  1. 运行应用

现在你可以运行你的Flutter应用,并观察计数器状态的持久化。每次你点击浮动按钮增加计数时,状态都会被保存到本地存储。如果你关闭应用并重新打开,你会发现计数器的值保持不变。

这个示例展示了如何使用state_persistence插件来简化Flutter应用中的状态持久化过程。根据你的需求,你可以进一步自定义和扩展这个示例。

回到顶部