Flutter共享功能插件x_shared的使用

Flutter共享功能插件x_shared的使用

x_shared 是一个用于存储数据的工具。本文将详细介绍如何在 Flutter 中使用该插件。


安装

pubspec.yaml 文件中添加依赖:

dependencies:
  x_shared: ^1.0.0

然后运行以下命令以安装依赖:

flutter pub get

使用

导入

首先需要导入 x_shared 包并初始化实例:

import 'package:x_shared/x_shared.dart';

XShared xShared = await XShared.getInstance();

基本用法

存储和获取基本类型数据

// bool
await xShared!.set('A', true);
bool? a = xShared!.get<bool>('A');
print('a $a'); // 输出: a true

// double
await xShared!.set('B', 0.0);
double? b = xShared!.get<double>('B');
print('b $b'); // 输出: b 0.0

// int
await xShared!.set('C', 0);
int? c = xShared!.get<int>('C');
print('c $c'); // 输出: c 0

// string
await xShared!.set('D', 'string');
String? d = xShared!.get<String>('D');
print('d $d'); // 输出: d string

// string list
await xShared!.set('E', ['a', 'b']);
List<String>? e = xShared!.get<List<String>>('E');
print('e $e'); // 输出: e [a, b]

存储类对象

注册编码与解码方法

首先定义类的编码和解码方法:

String _encodeStudent(Student student) {
  return jsonEncode({
    'name': student.name,
    'age': student.age,
  });
}

Student _decodeStudent(String str) {
  Map<String, dynamic> jsonData = jsonDecode(str);
  return Student(name: jsonData['name'], age: jsonData['age']);
}

然后注册这些方法:

XShared.registerType<Student>(_encodeStudent, _decodeStudent);

存储和获取类对象

// 存储 Student 对象
Student studentA = Student(name: 'A', age: 0);
await xShared!.set<Student>('student_a', studentA);
Student? studentB = xShared!.get<Student>('student_a');
print(studentB); // 输出: Student{name: A, age: 0}

// 存储 Teacher 对象
Teacher teacherA = Teacher(name: 'A', age: 0);
await xShared!.set('teacher_a', teacherA);
Teacher? teacherB = xShared!.get('teacher_a');
print(teacherB); // 输出: Teacher{name: A, age: 0}

存储类列表

注册编码与解码方法

XShared.registerType<List<Teacher>>(jsonEncode, (str) {
  Iterable l = json.decode(str);
  List<Teacher> teachers = l.map((item) => Teacher.fromJson(item)).toList();
  return teachers;
});

存储和获取类列表

// 存储 Teacher 列表
List<Teacher> studentsA = [
  Teacher(name: 'A', age: 0),
  Teacher(name: 'B', age: 1),
  Teacher(name: 'B', age: 2),
];
await xShared!.set<List<Teacher>>('students_a', studentsA);
List<Teacher>? studentsB = xShared!.get<List<Teacher>>('students_a');
print(studentsB); // 输出: [Teacher{name: A, age: 0}, Teacher{name: B, age: 1}, Teacher{name: B, age: 2}]

分组功能

设置全局分组

XShared.setGlobalGroup('global_group');

开始和结束分组

xShared.startGroup('school');
xShared.set<String>('name', 'school');
String? name = xShared.get<String>('name');
print('name $name'); // 输出: name school

xShared.startGroup('department');
xShared.set<String>('name', 'department');
name = xShared.get<String>('name');
print('name $name'); // 输出: name department

xShared.endGroup(); // 返回到上一级分组
name = xShared.get<String>('name');
print('name $name'); // 输出: name school

清除分组

xShared.clearGroup(); // 清除当前分组的所有数据
name = xShared.get<String>('name');
print('name $name'); // 输出: name null

清除全局分组

XShared.clearGlobalGroup(); // 清除全局分组的所有数据
name = xShared.get<String>('name');
print('name $name'); // 输出: name null

删除单个键值对

await xShared.set('A', true);
bool? a = xShared.get<bool>('A');
print('a $a'); // 输出: a true

xShared.remove('A');
a = xShared.get<bool>('A');
print('a $a'); // 输出: a null

清空所有数据

await XShared.clear(); // 清空所有存储的数据

示例代码

以下是完整的示例代码,展示了上述功能的完整实现:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:x_shared/x_shared.dart';
import 'package:x_shared_example/models/student.dart';
import 'package:x_shared_example/models/teacher.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'XShared Example',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  XShared? _xShared;

  [@override](/user/override)
  void initState() {
    _init();
    super.initState();
  }

  Future<void> _init() async {
    _xShared = await XShared.getInstance();
    XShared.registerType<Student>(_encodeStudent, _decodeStudent);
    XShared.registerType<Teacher>((Teacher teacher) => jsonEncode(teacher),
        (String str) => Teacher.fromJson(jsonDecode(str)));
    XShared.registerType<List<Teacher>>(
        (List<Teacher> students) => jsonEncode(students),
        (String str) {
      Iterable l = json.decode(str);
      List<Teacher> teachers = l.map((item) => Teacher.fromJson(item)).toList();
      return teachers;
    });
  }

  String _encodeStudent(Student student) {
    return jsonEncode({
      'name': student.name,
      'age': student.age,
    });
  }

  Student _decodeStudent(String str) {
    Map<String, dynamic> jsonData = jsonDecode(str);
    return Student(name: jsonData['name'], age: jsonData['age']);
  }

  // 基本操作
  void _basic() async {
    await _xShared!.set('A', true);
    bool? a = _xShared!.get<bool>('A');
    print('a $a');

    await _xShared!.set('B', 0.0);
    double? b = _xShared!.get<double>('B');
    print('b $b');

    await _xShared!.set('C', 0);
    int? c = _xShared!.get<int>('C');
    print('c $c');

    await _xShared!.set('D', 'string');
    String? d = _xShared!.get<String>('D');
    print('d $d');

    await _xShared!.set('E', ['a', 'b']);
    List<String>? e = _xShared!.get<List<String>>('E');
    print('e $e');
  }

  // 存储类对象
  void _class() async {
    Student studentA = Student(name: 'A', age: 0);
    await _xShared!.set<Student>('student_a', studentA);
    Student? studentB = _xShared!.get<Student>('student_a');
    print(studentB);

    Teacher teacherA = Teacher(name: 'A', age: 0);
    await _xShared!.set('teacher_a', teacherA);
    Teacher? teacherB = _xShared!.get('teacher_a');
    print(teacherB);
  }

  // 存储类列表
  void _listOfClasses() async {
    List<Teacher> studentsA = [
      Teacher(name: 'A', age: 0),
      Teacher(name: 'B', age: 1),
      Teacher(name: 'B', age: 2),
    ];
    await _xShared!.set<List<Teacher>>('students_a', studentsA);
    List<Teacher>? studentsB = _xShared!.get<List<Teacher>>('students_a');
    print(studentsB);
  }

  // 分组操作
  void _group() async {
    String? name;
    XShared xShared = await XShared.getInstance();
    await XShared.clear();

    xShared.set<String>('name', 'before global');
    name = xShared.get<String>('name');
    print('name $name'); // 输出: name before global

    XShared.setGlobalGroup('global_group');
    name = xShared.get<String>('name');
    print('name $name'); // 输出: name null

    xShared.set<String>('name', 'after global');
    name = xShared.get<String>('name');
    print('name $name'); // 输出: name after global

    xShared.startGroup('school');
    xShared.set<String>('name', 'school');
    name = xShared.get<String>('name');
    print('name $name'); // 输出: name school

    xShared.startGroup('department');
    xShared.set<String>('name', 'department');
    name = xShared.get<String>('name');
    print('name $name'); // 输出: name department

    xShared.endGroup();
    name = xShared.get<String>('name');
    print('name $name'); // 输出: name school
  }

  // 删除键值对
  void _remove() async {
    XShared xShared = await XShared.getInstance();

    await xShared.set('A', true);
    bool? a = xShared.get<bool>('A');
    print('a $a');

    xShared.remove('A');
    a = xShared.get<bool>('A');
    print('a $a');
  }

  // 清空所有数据
  void _clear() async {
    await XShared.clear();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('XShared')),
      body: ListView(
        padding: EdgeInsets.only(top: 10),
        children: <Widget>[
          MaterialButton(
            color: Colors.blue,
            onPressed: _basic,
            child: Text('Basic', style: TextStyle(color: Colors.white)),
          ),
          SizedBox(height: 10),
          MaterialButton(
            color: Colors.blue,
            onPressed: _class,
            child: Text('Class', style: TextStyle(color: Colors.white)),
          ),
          SizedBox(height: 10),
          MaterialButton(
            color: Colors.blue,
            onPressed: _listOfClasses,
            child: Text('List of class', style: TextStyle(color: Colors.white)),
          ),
          SizedBox(height: 10),
          MaterialButton(
            color: Colors.blue,
            onPressed: _group,
            child: Text('Group', style: TextStyle(color: Colors.white)),
          ),
          SizedBox(height: 10),
          MaterialButton(
            color: Colors.blue,
            onPressed: _remove,
            child: Text('Remove', style: TextStyle(color: Colors.white)),
          ),
          SizedBox(height: 10),
          MaterialButton(
            color: Colors.blue,
            onPressed: _clear,
            child: Text('Clear', style: TextStyle(color: Colors.white)),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


x_shared 是一个用于 Flutter 的共享功能插件,它允许你在应用中轻松地分享文本、图片、文件等内容到其他应用或平台。使用这个插件,你可以实现类似于社交分享、文件传输等功能。

安装 x_shared 插件

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

dependencies:
  flutter:
    sdk: flutter
  x_shared: ^1.0.0  # 请根据最新版本号进行替换

然后运行 flutter pub get 来安装插件。

使用 x_shared 插件

1. 导入插件

在需要使用插件的 Dart 文件中导入 x_shared

import 'package:x_shared/x_shared.dart';

2. 共享文本

你可以使用 XShared.shareText 方法来共享文本内容:

void shareText() async {
  String text = 'Check out this awesome app!';
  await XShared.shareText(text);
}

3. 共享图片

你可以使用 XShared.shareImage 方法来共享图片文件:

void shareImage() async {
  String imagePath = '/path/to/image.png';
  await XShared.shareImage(imagePath);
}

4. 共享文件

你可以使用 XShared.shareFile 方法来共享任意类型的文件:

void shareFile() async {
  String filePath = '/path/to/file.pdf';
  await XShared.shareFile(filePath);
}

5. 共享多个文件

你可以使用 XShared.shareFiles 方法来共享多个文件:

void shareMultipleFiles() async {
  List<String> filePaths = ['/path/to/file1.pdf', '/path/to/file2.png'];
  await XShared.shareFiles(filePaths);
}

处理权限

在 Android 上,你可能需要处理文件访问权限。确保在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

并在运行时请求权限:

import 'package:permission_handler/permission_handler.dart';

void requestPermissions() async {
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    await Permission.storage.request();
  }
}

注意事项

  • 确保共享的文件路径是有效的,并且应用有权限访问这些文件。
  • 在 iOS 上,共享功能依赖于系统的分享面板,因此不需要额外的权限处理。

示例代码

以下是一个完整的示例,展示了如何使用 x_shared 插件来共享文本、图片和文件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('x_shared Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: shareText,
                child: Text('Share Text'),
              ),
              ElevatedButton(
                onPressed: shareImage,
                child: Text('Share Image'),
              ),
              ElevatedButton(
                onPressed: shareFile,
                child: Text('Share File'),
              ),
              ElevatedButton(
                onPressed: shareMultipleFiles,
                child: Text('Share Multiple Files'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void shareText() async {
    String text = 'Check out this awesome app!';
    await XShared.shareText(text);
  }

  void shareImage() async {
    String imagePath = '/path/to/image.png';
    await XShared.shareImage(imagePath);
  }

  void shareFile() async {
    String filePath = '/path/to/file.pdf';
    await XShared.shareFile(filePath);
  }

  void shareMultipleFiles() async {
    List<String> filePaths = ['/path/to/file1.pdf', '/path/to/file2.png'];
    await XShared.shareFiles(filePaths);
  }
}
回到顶部