Получите значение, соответствующее вводимым пользователем данным

# #android #flutter #dart #firebase-realtime-database

Вопрос:

В следующем коде я хочу добиться двух вещей: а) Получить номер из базы данных firebase в реальном времени, который соответствует номеру, введенному пользователем. б) Перейдите на следующую страницу, если номер совпадает.

Но действительно ли необходимо создавать тип возвращаемого значения функции ? Какое было бы лучшее решение для следующей части кода.

 Container(
  margin: EdgeInsets.all(15),
  width: double.infinity,
  child: ElevatedButton(
      onPressed: () {
        FirebaseAnimatedList(
        query: _ref,
        itemBuilder: (BuildContext context, DataSnapshot snapshot,
        Animation<double> animation, int index) {
        Map readPhone = snapshot.value;
        readPhone['key'] = snapshot.key;

        if(readPhone['number']==dialCodeDigits _controller.text) {
          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (c) =>
                  OTPController(
                    phone: _controller.text,
                    codeDigits: dialCodeDigits,
                  ),
            ),
          );
        }
 
 import 'package:country_code_picker/country_code_picker.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_database/ui/firebase_animated_list.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'OTPController.dart';

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


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

class _LoginScreenState extends State<LoginScreen> {
  Query _ref;
  DatabaseReference reference =
      FirebaseDatabase.instance.reference().child('Subscribers');
  String dialCodeDigits = " 977";
  TextEditingController _controller = TextEditingController();

  @override
  initState() {
    // TODO: implement initState
    super.initState();
    _ref = FirebaseDatabase.instance
        .reference()
        .child('Subsdcribers')
        .orderByChild('number');
       // .equalTo(dialCodeDigits   _controller.text);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: SingleChildScrollView(
            child:
                Column(mainAxisAlignment: MainAxisAlignment.center, children: [
      SizedBox(height: 100),
      Padding(
        padding: const EdgeInsets.only(left: 28.0, right: 28.0),
        child: Image.asset("assets/prologo.png"),
      ),
      Container(
        margin: EdgeInsets.only(top: 10),
        child: Center(
            child: Text(
          "Phone (OTP) Authentication",
          style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
        )),
      ),
      SizedBox(
        height: 50,
      ),
      SizedBox(
        height: 60,
        width: 400,
        child: CountryCodePicker(
          onChanged: (country) {
            setState(() {
              dialCodeDigits = country.dialCode;
            });
          },
          initialSelection: "NPL",
          showCountryOnly: false,
          showOnlyCountryWhenClosed: false,
          favorite: [" 91", "IND", " 1", "USA"],
        ),
      ),
      Container(
          margin: EdgeInsets.only(top: 10, right: 10, left: 10),
          child: TextField(
            decoration: InputDecoration(
                hintText: "Phone Number",
                prefix: Padding(
                  padding: EdgeInsets.all(4),
                  child: Text(dialCodeDigits),
                )),
            maxLength: 12,
            keyboardType: TextInputType.number,
            controller: _controller,
          )),
      Container(
          margin: EdgeInsets.all(15),
          width: double.infinity,
          child: ElevatedButton(
              onPressed: () {
                FirebaseAnimatedList(
                query: _ref,
                itemBuilder: (BuildContext context, DataSnapshot snapshot,
                Animation<double> animation, int index) {
                Map readPhone = snapshot.value;
                readPhone['key'] = snapshot.key;
              
                if(readPhone['number']==dialCodeDigits _controller.text) {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (c) =>
                          OTPController(
                            phone: _controller.text,
                            codeDigits: dialCodeDigits,
                          ),
                    ),
                  );
                }



              });
              },
              child: Text(
                'Next',
                style:
                    TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
              )))
    ])));
  }
}
 

Комментарии:

1. В чем проблема с кодом, которым вы поделились? Когда вы выполняете этот код в отладчике, какая конкретная строка не выполняет то, что вы ожидаете от нее?

2. Сначала я получаю : его функция имеет возвращаемый тип «Виджет», но не заканчивается оператором return. Попробуйте добавить оператор return или изменить тип возврата на «void». и второе : когда я печатаю (readPhone[«номер») , я не получаю никакого значения.

3. если(readPhone[‘номер’]==dialCodeDigits _controller.text), это то, что я пытаюсь реализовать. readPhone[‘номер’] — это значение из реального времени и dialCodeDigits _controller.текст-это значение, введенное пользователем

4. О какой функции вы говорите, когда говорите «его функция»?

5. (Контекст BuildContext, снимок снимка DataSnapshot, анимация<двойная> анимация, индекс int)