flutter 我怎样才能在卡片背面以正确的书写方向显示文字?

9bfwbjaz  于 2023-04-22  发布在  Flutter
关注(0)|答案(1)|浏览(75)

我有一个Flutter容器,它可以通过GestureDetector来切换它的正面和背面。该容器使用Transform方法进行动画,围绕Y轴旋转以在正面和背面之间切换。
我遇到的问题是容器背面的文本没有正确对齐。文本看起来像是镜像的。我已经尝试更改文本小部件的textDirection属性,以从右到左或从左到右对齐文本,但它不起作用。
是否有其他方法可以在容器旋转后正确对齐容器背面的文本?
以下是我的当前代码:

import 'dart:math';

import 'package:flutter/material.dart';

class FlipCard extends StatefulWidget {
  const FlipCard({Key? key}) : super(key: key);

  @override
  State<FlipCard> createState() => _FlipCardState();
}

class _FlipCardState extends State<FlipCard>
    with SingleTickerProviderStateMixin {
  bool _isFrontVisible = true;
  late AnimationController _flipAnimationController;
  late Animation<double> _flipAnimation;

  @override
  void initState() {
    super.initState();
    _flipAnimationController =
        AnimationController(vsync: this, duration: Duration(milliseconds: 500));
    _flipAnimation =
        Tween<double>(begin: 0.0, end: 1.0).animate(_flipAnimationController);
  }

  @override
  void dispose() {
    _flipAnimationController.dispose();
    super.dispose();
  }

  void _toggleCard() {
    if (_isFrontVisible) {
      _flipAnimationController.forward();
    } else {
      _flipAnimationController.reverse();
    }
    _isFrontVisible = !_isFrontVisible;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GestureDetector(
          onTap: () => _toggleCard(),
          child: AnimatedBuilder(
            animation: _flipAnimation,
            builder: (context, child) {
              final value = _flipAnimation.value;
              final perspective = 0.002;
              final angle = value * pi;
              final isFrontFacing = angle <= pi / 2;
              return Transform(
                transform: Matrix4.identity()
                  ..setEntry(3, 2, perspective)
                  ..rotateY(angle),
                alignment: Alignment.center,
                child: Container(
                  height: 200,
                  width: 300,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: isFrontFacing ? Colors.white : Colors.blueGrey,
                  ),
                  child: Center(
                    child: Text(
                      isFrontFacing ? "Vorderseite" : "Rückseite",
                      style: TextStyle(
                        fontSize: 20,
                        color: isFrontFacing ? Colors.black : Colors.white,
                      ),
                      textDirection:
                          isFrontFacing ? TextDirection.rtl : TextDirection.ltr,
                    ),
                  ),
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

提前感谢您的帮助!

qxsslcnc

qxsslcnc1#

转换卡内的文本小部件(用于“背面”)是一种可能性。
下面我们将前面和后面的卡拆分成它们自己的Widget,然后根据isFrontFacing调用任何一个Widget。

class CardTextBack extends StatelessWidget {
  const CardTextBack();

  @override
  Widget build(BuildContext context) {
    return Transform(
        alignment: Alignment.center,
        transform: Matrix4.rotationY(pi),
        child: const Text("Rückseite",
            style: TextStyle(
              fontSize: 20,
              color: Colors.white,
            )));
  }
}

class CardTextFront extends StatelessWidget {
  const CardTextFront();

  @override
  Widget build(BuildContext context) {
    return const Text("Vorderseite",
        style: TextStyle(
          fontSize: 20,
          color: Colors.black,
        ));
  }
}

class CardText extends StatelessWidget {
  const CardText(this.isFrontFacing);

  final bool isFrontFacing;

  @override
  Widget build(BuildContext context) {
    if (isFrontFacing) {
      return const CardTextFront();
    }
    return const CardTextBack();
  }
}

在您的_FlipCardState中,我们将您的最终child:替换为:

child: Center(child: CardText(isFrontFacing)),

相关问题