Проблема с загрузкой фотографий Flutter firebase на устройствах IOS

# #ios #firebase #flutter #file-upload #firebase-storage

Вопрос:

Я хочу загрузить изображение из галереи в flutter. Устройства Android работают отлично, однако, когда я нажимаю кнопку «Изменить» на устройствах Ios, я получаю сообщение об ошибке » Было выдано другое исключение: Ошибка LateInitializationError: Поле «indirmeBaglantisi» не было инициализировано».

Что может быть причиной этой ошибки? Вот мой код:

 class _AyarlarState extends State<Ayarlar> {

 final AuthService _auth = AuthService();
 FirebaseAuth auth = FirebaseAuth.instance;
 late String indirmeBaglantisi;
 late File yuklenecekDosya;
@override
 void initState(){
   super.initState();
   WidgetsBinding.instance!.addPostFrameCallback((_) => baglantiAl());
 }

 baglantiAl() async {
    String baglanti = await FirebaseStorage.instance
      .ref()
      .child("profilresimleri")
      .child(auth.currentUser!.uid)
      .child("profilResmi.png").getDownloadURL();

      setState(() {
        indirmeBaglantisi = baglanti;
      });
 }

 kameradanYukle() async {
     // ignore: deprecated_member_use
     var alinanDosya = await ImagePicker().getImage(source: ImageSource.gallery);
     setState(() {
       yuklenecekDosya = File(alinanDosya!.path);
     });
    Reference referansYol = FirebaseStorage.instance
      .ref()
      .child("profilresimleri")
      .child(auth.currentUser!.uid)
      .child("profilResmi.png");

    UploadTask yuklemeGorevi = referansYol.putFile(yuklenecekDosya);

    String url = await (await yuklemeGorevi).ref.getDownloadURL();
    
    setState(() {
      indirmeBaglantisi = url;
    });
     
 }

  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
    
      body: Container(
        color: Colors.black,
        child: Stack(
        children: <Widget>[
            Container(
              decoration: BoxDecoration(
                color: Color(0XFF1E1E37),
              
              ),
            ),
            Padding(
              padding: EdgeInsets.only(top:130),
              child: Column(
                children: <Widget> [
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget> [
                      Container(

                        child: Row(
                          children: [
                            ClipOval(
                              
                              child: indirmeBaglantisi == null ? Image.asset("assets/images/Oval2.png") : Image.network(indirmeBaglantisi,height: 100,width:100 ,fit:BoxFit.fitWidth),
                              )
                          ],
                        ),
                         
                          ),
                    ],
                  ), 
                  SizedBox(height: 20),
              // ignore: deprecated_member_use
               RaisedButton.icon(
                  padding: EdgeInsets.symmetric(vertical: 8.0,horizontal: 10.0),
                  onPressed: () {

                   kameradanYukle(); 

                  },
                  shape:RoundedRectangleBorder(
                  
                  borderRadius: BorderRadius.all(Radius.circular(30)),
                ) ,
                  icon: Icon(Icons.insert_photo_outlined, color: Colors.blue,), label: Text('Profil Fotoğrafını Değiştir'),
                  color: Colors.white,
                  ),
                 
 

Ответ №1:

Вполне вероятно, что вы забыли запросить разрешение на использование библиотеки фотографий пользователя, так как это необходимо сделать в IOS.

Перейдите в папку IOS, а внутри нее перейдите в папку Runner. Найдите файл info.plist и добавьте в него следующее:

 <key>NSPhotoLibraryUsageDescription</key>
<string>Allow access to photo library?</string>
 

Вы можете заменить текст второй строки тем, что хотите, чтобы пользователь видел.