register_page.dart 7.54 KB
import 'package:Parlando/login/models/auth_entity.dart';
import 'package:Parlando/net/dio_utils.dart';
import 'package:Parlando/net/http_api.dart';
import 'package:Parlando/res/constant.dart';
import 'package:Parlando/routers/fluro_navigator.dart';
import 'package:Parlando/routers/routers.dart';
import 'package:email_validator/email_validator.dart';
import 'package:flustars/flustars.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:Parlando/home/webview_page.dart';
import 'package:Parlando/login/widgets/my_text_field.dart';
import 'package:Parlando/res/resources.dart';
import 'package:Parlando/util/change_notifier_manage.dart';
import 'package:Parlando/util/other_utils.dart';
import 'package:Parlando/util/toast_utils.dart';
import 'package:Parlando/widgets/my_app_bar.dart';
import 'package:Parlando/widgets/my_button.dart';
import 'package:Parlando/widgets/my_scroll_view.dart';

import 'package:flutter_gen/gen_l10n/Parlando_localizations.dart';
import 'package:Parlando/extension/int_extension.dart';
import 'package:getwidget/getwidget.dart';

/// design/1注册登录/index.html#artboard11
class RegisterPage extends StatefulWidget {
  const RegisterPage({Key? key}) : super(key: key);

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

class _RegisterPageState extends State<RegisterPage>
    with ChangeNotifierMixin<RegisterPage> {
  //定义一个controller
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _vCodeController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();
  final FocusNode _nodeText1 = FocusNode();
  final FocusNode _nodeText2 = FocusNode();
  final FocusNode _nodeText3 = FocusNode();
  bool _clickable = false;
  bool _isLoading = false;

  @override
  Map<ChangeNotifier, List<VoidCallback>?>? changeNotifier() {
    final List<VoidCallback> callbacks = <VoidCallback>[_verify];
    return <ChangeNotifier, List<VoidCallback>?>{
      _nameController: callbacks,
      _vCodeController: callbacks,
      _passwordController: callbacks,
      _nodeText1: null,
      _nodeText2: null,
      _nodeText3: null,
    };
  }

  void _verify() {
    final String name = _nameController.text;
    final String vCode = _vCodeController.text;
    final String password = _passwordController.text;
    bool clickable = true;
    if (name.isEmpty || name.length < 5) {
      clickable = false;
    }
    if (vCode.isEmpty || vCode.length < 6) {
      clickable = false;
    }
    if (password.isEmpty || password.length < 6) {
      clickable = false;
    }
    if (clickable != _clickable) {
      setState(() {
        _clickable = clickable;
      });
    }
  }

  void _register() {
    _isLoading = true;
    setState(() {});
    Map<String, String> params = <String, String>{
      "email": _nameController.text,
      "password": _passwordController.text,
      "verify_code": _vCodeController.text,
    };
    DioUtils.instance.asyncRequestNetwork<AuthEntity>(
      Method.post,
      HttpApi.register,
      params: params,
      onSuccess: (data) {
        SpUtil.putString(Constant.userToken, data!.data!.token!);
        NavigatorUtils.push(context, Routes.navBarPage, clearStack: true);
        _isLoading = false;
      },
      onError: (code, msg) {
        Toast.show(msg);
        _isLoading = false;
        setState(() {});
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: const MyAppBar(
        isTransparent: true,
      ),
      body: MyScrollView(
        keyboardConfig: Utils.getKeyboardActionsConfig(
            context, <FocusNode>[_nodeText1, _nodeText2, _nodeText3]),
        crossAxisAlignment: CrossAxisAlignment.center,
        padding: EdgeInsets.only(left: 16.px, right: 16.px, top: 20.px),
        children: _buildBody(),
      ),
    );
  }

  List<Widget> _buildBody() {
    return <Widget>[
      Text(
        ParlandoLocalizations.of(context).openYourAccount,
        style: TextStyles.textBold26,
      ),
      Gaps.vGap16,
      MyTextField(
        key: const Key('email'),
        focusNode: _nodeText1,
        controller: _nameController,
        maxLength: 100,
        keyboardType: TextInputType.emailAddress,
        hintText: ParlandoLocalizations.of(context).inputEmailHint,
      ),
      Gaps.vGap8,
      MyTextField(
        key: const Key('vcode'),
        focusNode: _nodeText2,
        controller: _vCodeController,
        keyboardType: TextInputType.number,
        getVCode: () async {
          bool valid = EmailValidator.validate(_nameController.text);
          if (valid) {
            Toast.show(ParlandoLocalizations.of(context).verificationButton);
            Map<String, String> params = <String, String>{
              "email": _nameController.text,
            };
            DioUtils.instance.asyncRequestNetwork(
              Method.get,
              HttpApi.verify,
              params: [],
              queryParameters: params,
              onSuccess: (data) {
                print(data);
              },
              onError: (code, msg) {},
            );
          } else {
            Toast.show(ParlandoLocalizations.of(context).inputPhoneInvalid);
            return false;
          }

          return true;
        },
        maxLength: 6,
        hintText: ParlandoLocalizations.of(context).inputVerificationCodeHint,
      ),
      Gaps.vGap8,
      MyTextField(
        key: const Key('password'),
        keyName: 'password',
        focusNode: _nodeText3,
        isInputPwd: true,
        controller: _passwordController,
        keyboardType: TextInputType.visiblePassword,
        hintText: ParlandoLocalizations.of(context).inputPasswordHint,
      ),
      Gaps.vGap8,
      Text.rich(
        TextSpan(
            text: ParlandoLocalizations.of(context).agreement,
            style: const TextStyle(fontSize: 14, color: Color(0xFF999999)),
            children: [
              TextSpan(
                text: '《${ParlandoLocalizations.of(context).user_agreement}》',
                style: TextStyle(color: Theme.of(context).primaryColor),
                recognizer: TapGestureRecognizer()
                  ..onTap = () {
                    Navigator.of(context)
                        .push(MaterialPageRoute(builder: (context) {
                      return WebViewPage(
                          title:
                          '《${ParlandoLocalizations.of(context).user_agreement}》',
                          url: 'https://flutter.dev');
                    }));
                  },
              ),
              const TextSpan(text: ' & '),
              TextSpan(
                text: '《${ParlandoLocalizations.of(context).privacy_policy}》',
                style: TextStyle(color: Theme.of(context).primaryColor),
                recognizer: TapGestureRecognizer()
                  ..onTap = () {
                    Navigator.of(context)
                        .push(MaterialPageRoute(builder: (context) {
                      return WebViewPage(
                          title:
                          '《${ParlandoLocalizations.of(context).privacy_policy}》',
                          url: 'https://flutter.dev');
                    }));
                  },
              ),
            ]),
      ),
      Gaps.vGap24,
      MyButton(
        key: const Key('register'),
        onPressed: _clickable && !_isLoading ? _register : null,
        text: ParlandoLocalizations.of(context).register,
      ),
      Container(
        child: _isLoading ? const GFLoader() : null,
      ),
    ];
  }
}