Flutter流式打字机效果插件stream_typewriter_text的使用

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

Flutter流式打字机效果插件stream_typewriter_text的使用

stream_typewriter_text 是一个提供打字机文本动画效果的Flutter插件。本文将介绍如何安装和使用这个插件,并提供一个完整的示例demo。

安装步骤

1. 添加依赖

在您的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  stream_typewriter_text: ^1.0.8

2. 安装包

您可以从命令行安装包:

使用 pub:

$ pub get

使用 Flutter:

$ flutter pub get

3. 导入包

现在,在您的 Dart 代码中可以导入该包:

import 'package:stream_typewriter_text/stream_typewriter_text.dart';

使用方法

StreamTypewriterAnimatedText 是一个产生文本动画的有状态小部件。您可以在 build 方法中这样使用它:

StreamBuilder(
  stream: _streamController.stream,
  builder: (context, snapshot) {
    final text = snapshot.data ?? '';
    return StreamTypewriterAnimatedText(
      text: text,
      style: const TextStyle(
        fontSize: 16,
        fontWeight: FontWeight.bold,
        color: Colors.black,
      ),
      maxLines: 5,
      overflow: TextOverflow.ellipsis,
    );
  },
)

示例Demo

以下是一个完整的示例,展示了如何使用 stream_typewriter_text 插件来实现打字机效果:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
import 'package:stream_typewriter_text/stream_typewriter_text.dart';

const loremText = """
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
""";

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _streamController = BehaviorSubject<String>.seeded("...");

  bool _canTap = true;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.black,
        appBar: AppBar(
          backgroundColor: Colors.black,
          title: const Text(
            'Stream Typewriter Text',
            style: TextStyle(
              color: Colors.white,
            ),
          ),
        ),
        body: SizedBox.expand(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Container(
                padding: const EdgeInsets.all(16),
                constraints: BoxConstraints(
                  minWidth: 96,
                  maxWidth: MediaQuery.sizeOf(context).width - 48,
                ),
                child: Container(
                  margin: const EdgeInsets.only(bottom: 16),
                  child: StreamBuilder(
                    stream: _streamController.stream,
                    builder: (context, snapshot) {
                      final text = snapshot.data ?? '';
                      return StreamTypewriterAnimatedText(
                        text: text,
                        style: const TextStyle(
                          fontSize: 16,
                          fontWeight: FontWeight.bold,
                          color: Colors.black,
                        ),
                        maxLines: 5,
                        overflow: TextOverflow.ellipsis,
                        isHapticFeedbackEnabled: true,
                        speed: const Duration(milliseconds: 30),
                        pause: const Duration(milliseconds: 100),
                      );
                    },
                  ),
                ),
              ),
              const SizedBox(height: 16),
              ElevatedButton(
                onPressed: () async {
                  if (_canTap) {
                    _canTap = false;
                    _streamController.add("Thinking...");
                    await Future.delayed(const Duration(milliseconds: 1000));
                    var count = 0;
                    await Future.doWhile(() async {
                      count += 10;
                      if (count > loremText.length) {
                        return false;
                      }
                      _streamController.add(loremText.substring(0, count));
                      await Future.delayed(const Duration(milliseconds: 100));
                      return true;
                    });
                    _canTap = true;
                  }
                },
                child: const Text('Start Stream'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    _streamController.close();
    super.dispose();
  }
}

更多关于Flutter流式打字机效果插件stream_typewriter_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter流式打字机效果插件stream_typewriter_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 stream_typewriter_text 插件在 Flutter 中实现流式打字机效果的代码示例。这个插件允许你以流的方式逐个字符地显示文本,非常适合创建动态文本显示效果。

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

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

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

接下来,在你的 Dart 文件中,你可以按照以下方式使用 StreamTypewriterText 组件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Stream Typewriter Text Example'),
        ),
        body: Center(
          child: StreamTypewriterText(
            text: '这是一个流式打字机效果的示例。',
            speed: Duration(milliseconds: 200),  // 每个字符显示的速度
            onFinished: () {
              print('文本显示完成!');
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们导入了必要的包,包括 flutter/material.dartstream_typewriter_text
  2. 创建了一个简单的 Flutter 应用,其中包含一个 MaterialApp 和一个 Scaffold
  3. Scaffoldbody 中,我们使用了 StreamTypewriterText 组件。
  4. text 参数定义了要显示的文本。
  5. speed 参数定义了每个字符显示的速度。这里设置为每个字符显示 200 毫秒。
  6. onFinished 是一个可选的回调,当文本显示完成时会被调用。

你可以根据需要调整 textspeed 参数来实现不同的打字机效果。

这个插件提供了简单而强大的方式来创建流式打字机效果,非常适合在应用中展示动态文本内容。

回到顶部