Возвращает строку в функции

#function #flutter #dart #return #flutter-web

#функция #flutter #dart #Возврат #flutter-web

Вопрос:

Я работаю над проектом для управления местоположением на складе. Этот код проверяет доступное пространство. Но у меня проблема с этим кодом.

Когда я вызываю функцию, она возвращает строку, но возврат «locatie is bezet» не работает. Почему это?

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:transportmanagement/locations/AvailableLocations.dart';

final firestoreInstance = FirebaseFirestore.instance;
var locations = availableLocations;


Future<String> CheckLocation(Location_check) async{
  // This function checks the avalible space in SGF.
  String checkLocation;
  if (Location_check.isEmpty){
    checkLocation= "Vul een locatie in";
    // return "Vul een locatie in";
  }
  else{
    if (availableLocations.containsKey(Location_check)) {
      // Check if the location is in availablelocations.dart

      // Checks if there is already a pallet on this location in Firebase
      await firestoreInstance.collection("Orders").where("locatie", isEqualTo: Location_check).limit(1).get().then((querySnapshot) {
        querySnapshot.docs.forEach((result) {
          //print(result.data());
          checkLocation= "Locatie is bezet";
        });
      });
      // return null;

    }
    else{
      checkLocation= "Locatie bestaat niet";
      // return "Locatie bestaat niet";

    }
  }
  return     checkLocation;
}
 

Вызов кода:

               Row(
                mainAxisAlignment: MainAxisAlignment.start,
                children: [
                  Container(
                    margin: EdgeInsets.fromLTRB(0, 0, 0, 0),
                    width: 150,
                    child: TextFormField(
                        autofocus: true,
                        obscureText: false,
                        decoration: InputDecoration(
                          fillColor: Colors.white, filled: true,
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.all(Radius.circular(0)),
                          ),
                        ),
                      onSaved: (String value) {
                        _locatie = value;
                      },
                      validator: (value) {
                          var test = CheckLocation(value);
                          return test;
                      },
                    ),
                  ),
                ],
              ),
 

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

1. Что возвращает метод CheckLocation?

2. Он возвращает строку с текстом на голландском языке «в этом местоположении уже есть поддон».

3. Все остальные возвраты работают, но этот нет. Я думаю, это потому, что этот возврат находится внутри оператора if.

Ответ №1:

Определите строковую переменную внутри функции, а затем верните переменную

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:transportmanagement/locations/AvailableLocations.dart';

final firestoreInstance = FirebaseFirestore.instance;
var locations = availableLocations;


String CheckLocation(Location_check) {
  // This function checks the avalible space in SGF.
  String checkLocation;
  if (Location_check.isEmpty){
    checkLocation= "Vul een locatie in";
    // return "Vul een locatie in";
  }
  else{
    if (availableLocations.containsKey(Location_check)) {
      // Check if the location is in availablelocations.dart

      // Checks if there is already a pallet on this location in Firebase
      firestoreInstance.collection("Orders").where("locatie", isEqualTo: Location_check).limit(1).get().then((querySnapshot) {
        querySnapshot.docs.forEach((result) {
          //print(result.data());
          checkLocation= "Locatie is bezet";
        });
      });
      // return null;

    }
    else{
      checkLocation= "Locatie bestaat niet";
            // return "Locatie bestaat niet";

    }
  }
  return     checkLocation;
}
 

Я надеюсь, что это полезно

ОБНОВИТЕ переменную querySnapshot.docs.forEach excite после возврата checkLocation

так что возвращаемое значение null вы должны добавить await к firestoreInstance.collection("Orders").where("locatie", isEqualTo: Location_check).limit(1).get()

видите, что

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:transportmanagement/locations/AvailableLocations.dart';

final firestoreInstance = FirebaseFirestore.instance;
var locations = availableLocations;


String CheckLocation(Location_check) {
  // This function checks the avalible space in SGF.
  String checkLocation;
  if (Location_check.isEmpty){
    checkLocation= "Vul een locatie in";
    // return "Vul een locatie in";
  }
  else{
    if (availableLocations.containsKey(Location_check)) {
      // Check if the location is in availablelocations.dart

      // Checks if there is already a pallet on this location in Firebase
    await  firestoreInstance.collection("Orders").where("locatie", isEqualTo: Location_check).limit(1).get().then((querySnapshot) {
        querySnapshot.docs.forEach((result) {
          //print(result.data());
          checkLocation= "Locatie is bezet";
        });
      });
      // return null;

    }
    else{
      checkLocation= "Locatie bestaat niet";
            // return "Locatie bestaat niet";

    }
  }
  return     checkLocation;
}
 

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

1. Спасибо за вашу помощь! Ваш код выглядит хорошо. Но также, когда я вызываю этот код, он возвращает все контрольные местоположения, но «Местоположение не задано» возвращает значение null.

2. Это означает, что условие не выполнено или что в моментальном снимке нет документа

3. попробуйте распечатать результат документа

4. добавить ожидание перед firestoreInstance.collection("Orders").where("locatie", isEqualTo: Location_check).limit(1).get()

5. Я добавил «print (checkLocation)» перед «return checkLocation», и результат равен нулю. Но когда я добавляю «print («test») под «checkLocation = «Locatie is bezet», результатом является test. Таким образом, код запускает оператор print .