Flutter数据插入插件inserter的使用

Flutter数据插入插件inserter的使用

Inserter 是一个用于根据特定策略将 String 插入到 File 中的工具。

安装

dart pub add inserter

使用

以下是一个简单的示例,展示如何使用 Inserter 插入文本到文件中:

import 'dart:io';

import 'package:inserter/inserter.dart';

const keyOne = 'KEY_ONE';
const keyTwo = 'KEY_TWO';
const keyThree = 'KEY_THREE';

void main() async {
  final srcFile = File('example/src');

  final builders = [
    MatcherBuilder(
      matcher: (file, line) async => line.contains(keyOne),
      builder: (file, line) async => 'UPDATE FOR $keyOne',
    ),
    MatcherBuilder(
      matcher: (file, line) async => line.contains(keyTwo),
      builder: (file, line) async {
        const insert = 'UPDATE FOR $keyTwo';
        // 打印一条日志,显示何时写入新行
        stdout.writeln('writing $insert in ${file.path}');
        return insert;
      },
      strategy: BuilderStrategy.above,
    ),
    MatcherBuilder(
      matcher: (file, line) async => line.contains(keyThree),
      builder: (file, line) async =>
          line.split(' ').fold<String>('', (previous, word) {
        final forInsert = word == keyThree ? 'UPDATE FOR $keyThree' : word;
        return '${previous.isEmpty ? '' : '$previous '}$forInsert';
      }),
      // 停止匹配后一次
      stopWhen: (_, __, totalMatches) async => totalMatches > 0,
      strategy: BuilderStrategy.replace,
    ),
  ];

  // 执行插入器
  final inserter = Inserter(
    files: [await srcFile.copy('example/execute.test')],
    builders: builders,
  );

  // 运行插入器
  await inserter.execute();

  // 使用 "Inserter.run" 进行一次性插入
  await Inserter.run(
    files: [await srcFile.copy('example/run.test')],
    builders: builders,
  );
}

文件内容变化

初始文件 example/src 的内容如下:

// KEY_ONE
// KEY_TWO
// KEY_THREE

运行上述代码后,example/execute.testexample/run.test 文件的内容将变为:

// KEY_ONE
+UPDATE FOR KEY_ONE
+writing UPDATE FOR KEY_TWO in example/execute.test
+UPDATE FOR KEY_TWO
+UPDATE FOR KEY_THREE

非UTF-8编码处理

如果需要处理非UTF-8编码的文件,可以扩展 InserterBase 类并提供自己的 LineConverter 方法:

class MyOtherInserter extends InserterBase {
  MyOtherInserter({
    required this.files,
    required this.builders,
  }) : super({
    buffer: StringBuffer(), // 通常允许注入此对象以进行测试。
    readLines: (file) {
        /// .... 不是真实的方法
        return Stream.fromIterable(File(file).readAsLinesSync());
    }
  });
}

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

1 回复

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


在使用 Flutter 进行开发时,如果你需要将数据插入到数据库或实现类似的功能,你可以使用各种插件来完成。虽然 Flutter 本身没有名为 inserter 的官方插件,但你可以使用 sqflite 或其他数据库插件来插入数据。下面是一个使用 sqflite 插件插入数据的示例。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sqflitepath 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path: ^1.8.0

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

2. 创建数据库和表

接下来,创建一个数据库并定义一个表。以下是一个简单的示例,展示了如何创建一个数据库并插入数据。

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  static Database? _database;

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  Future<Database> _initDatabase() async {
    String path = join(await getDatabasesPath(), 'my_database.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  Future<void> _onCreate(Database db, int version) async {
    await db.execute(
      'CREATE TABLE my_table(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
    );
  }

  Future<int> insertData(Map<String, dynamic> data) async {
    Database db = await database;
    return await db.insert('my_table', data);
  }
}

3. 插入数据

现在你可以使用 DatabaseHelper 类来插入数据:

void insertData() async {
  DatabaseHelper helper = DatabaseHelper();

  Map<String, dynamic> row = {
    'name': 'John Doe',
    'age': 30,
  };

  int id = await helper.insertData(row);
  print('Inserted row id: $id');
}

4. 完整示例

以下是一个完整的 Flutter 应用示例,展示了如何插入数据:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter SQLite Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              insertData();
            },
            child: Text('Insert Data'),
          ),
        ),
      ),
    );
  }

  void insertData() async {
    DatabaseHelper helper = DatabaseHelper();

    Map<String, dynamic> row = {
      'name': 'John Doe',
      'age': 30,
    };

    int id = await helper.insertData(row);
    print('Inserted row id: $id');
  }
}
回到顶部