【问题标题】:TapGestureRecognizer not working in flutterTapGestureRecognizer 无法正常工作
【发布时间】:2022-11-29 22:54:03
【问题描述】:

我正在尝试在 TextSpan 上使用 TapGestureRecognizer 在 flutter 中的身份验证页面之间添加导航。一切都已设置,但单击的文本仍未导航到首选页面。

我使用 TapGestureRecognizer 的登录用户界面的一部分:

RichText(
                      text: TextSpan(
                          text: 'No account',
                          style: TextStyle(color: Colors.black),
                          children: [
                        TextSpan(
                            recognizer: TapGestureRecognizer()
                              ..onTap = () => widget.onClickedSignUp,
                            text: 'Click Here',
                            style: TextStyle(
                                decoration: TextDecoration.underline,
                                color: Colors.black))
                      ]))

login.dart 的第一部分:

class LoginScreen extends StatefulWidget {
  final VoidCallback onClickedSignUp;

  const LoginScreen({Key? key, required this.onClickedSignUp})
      : super(key: key);

  @override
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  TextEditingController emailController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  final navigatorKey = GlobalKey<NavigatorState>();
  final formKey = GlobalKey<FormState>();

  @override
  void dispose() {
    emailController.dispose();
    passwordController.dispose();
    super.dispose();
  }

认证飞镖:

class _AuthPageState extends State<AuthPage> {
  bool isLogin = true;
  @override
  Widget build(BuildContext context) => isLogin
      ? LoginScreen(onClickedSignUp: toggle)
      : SignUpScreen(onClickedSignIn: toggle);
  void toggle() {
    setState(() {
      isLogin != isLogin;
    });
  }
}

主要飞镖:

class MainPage extends StatelessWidget {
  const MainPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        } else if (snapshot.hasError) {
          return Center(child: Text('Something went wrong'));
        } else if (snapshot.hasData) {
          return HomeScreen();
        } else {
          return AuthPage();
        }
      },
    ));
  }
}

如果有人能帮助我,我将不胜感激!

【问题讨论】:

    标签: flutter


    【解决方案1】:

    尝试这个

    ..onTap = () => widget.onClickedSignUp.call(),
    

    或这个

    ..onTap = widget.onClickedSignUp,
                 
    

    【讨论】:

    • 不幸的是,他们都没有工作!
    • 请分享完整代码,两者都是工作示例
    • 添加了更多代码!
    【解决方案2】:

    在函数内部调用方法使用()

    TextSpan(
       recognizer: TapGestureRecognizer()
         ..onTap = () => widget.onClickedSignUp(),
    

    【讨论】:

    • 将类型更改为 Function() 而不是 VoidCallback 并添加了 (),现在它返回一个错误,表明在构建期间调用了 setState。在其上调用 setState 的小部件是 AuthPage,而在违规调用时当前正在构建的小部件是 LoginScreen ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    相关资源
    最近更新 更多