首页 > 解决方案 > 如果 HTTP 调用成功,Flutter 会在屏幕上导航

问题描述

[关闭]

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

import 'package:uni_links/uni_links.dart';

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

  @override
  _AuthWaitScreenState createState() => _AuthWaitScreenState();
}

class _AuthWaitScreenState extends State<AuthWaitScreen>
    with SingleTickerProviderStateMixin {
  Uri? _initialUri;
  Uri? _latestUri;
  Object? _err;

  String? userId;
  String? token;

  StreamSubscription? _sub;

  @override
  void initState() {
    super.initState();
    _handleIncomingLinks();
  }

  void confirm(String userId, String token) async {
    final url = Uri.parse(
        'https://api-staging.xxxx.us.org/1.0/auth/attendee/token');
    http.post(
      url,
      headers: {
        'Accept': 'application/json',
      },
      body: {"userid": userId, "cryptostring": token},
    ).then((res) {
      print(res.statusCode);
      print(res.body);
    });
  }

  void _handleIncomingLinks() {
    if (!kIsWeb) {
      // It will handle app links while the app is already started - be it in
      // the foreground or in the background.
      _sub = uriLinkStream.listen((Uri? uri) {
        if (!mounted) return;

        setState(() {
          userId = uri.toString().split("/")[3];
          token = uri.toString().split("/")[4];
          _latestUri = uri;
          _err = null;
        });
        confirm(userId!, token!);
      }, onError: (Object err) {
        if (!mounted) return;
        print('got err: $err');
        setState(() {
          _latestUri = null;
          if (err is FormatException) {
            _err = err;
          } else {
            _err = null;
          }
        });
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            Container(
              child: ElevatedButton(
                child: Text('Button'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

嗨,我正在构建一个电子邮件身份验证应用程序,这是waiting_screen.dart文件,如果功能确认工作(状态代码 200),屏幕的目的是将用户重定向到另一个屏幕。我将解释代码是如何工作的:

  1. 我正在使用 uni_links 包(基本上,如果用户单击电子邮件链接,它会使用我们的用户 ID 和令牌重定向到我们的应用程序)
  2. 我用 userId 和 token 调用了另一个端点来获取 token 和过期日期
  3. 如果呼叫成功,我如何将其导航到其他页面?

现在的问题是我需要导航上下文,那么它是如何工作的呢?

标签: flutterdart

解决方案


推荐阅读