Приложение Flutter показывает белый экран в режиме выпуска приложения?

#flutter #dart

#флаттер #dart

Вопрос:

Я столкнулся с очень странной проблемой в приложении flutter! Когда я тестирую свое приложение в режиме отладки, оно работает нормально, а в режиме выпуска отображается белый экран. Это приложение уже опубликовано в playstore. Через несколько дней я изменил это приложение. Я хочу выпустить вторую версию. Когда я пытаюсь создать релиз apk, он показывает белый экран в режиме отладки, который работает нормально. Почему это происходит? Это проблема с версией flutter?

изображение первое

изображение второе

вот код

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:tv/Online.dart';
import 'package:tv/paypal.dart';
import 'package:url_launcher/url_launcher.dart';


class Donateus extends StatefulWidget {
  @override
  _DonateusState createState() => _DonateusState();
}

class _DonateusState extends State<Donateus> {
  bool _isExpandedonline=false;
  bool _isExpandedpaypal=false;
  bool _isExpandedetransfer=false;
  bool _isExpandedtexttogive=false;

  void customLaunch(command) async {
    if (await canLaunch(command)) {
      await launch(command);
    } else {
      print(' could not launch $command');
    }
  }
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        scrollDirection: Axis.vertical,
        child:Padding(
          padding: EdgeInsets.all(10),

          child: Container(
            child:Expanded(
              child: Column(
                children: <Widget>[
                  Text(
                    'WAYS TO DONATE',
                    style: TextStyle(
                      fontFamily: 'TT NORMS',
                      fontSize: 20,
                      fontWeight: FontWeight.w100,
                    ),


                  ),
                  Padding(
                    padding: EdgeInsets.only(left: 10),
                    child: Text(
                      'All of our Donations are processed through Cornerstone Asian Church.We are a registered Canadian Charity (842869265RR0001). A Canadian Tax-deductible receipt will be issued to you.',
                      style: TextStyle(

                          fontSize: 14
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.only(left: 10),
                    child: ExpansionTile(
                        onExpansionChanged: (value) {
                          _isExpandedonline=value;
                          setState(() {});
                        },
                        children: <Widget>[
                          Text(
                            'Give a single gift, or schedule a recurring amount by using your Credit cards (i.e Mastercard, VISA, AMEX).'
                                'Note: Cornerstone uses the giving provider, Tithe.ly to securely process online donations from all over the world. Our Church will cover all associated fees for this service which are 2.5%   15 cents (CAD) for all  Credit Cards. AMEX is 3.5%   30 cents (CAD). However, if you wish to cover the fees as well, you can click on the option to "Cover Fees".',style: TextStyle(

                            fontSize: 14,


                          ),)
                        ],

                        title: Row(
                          children: <Widget>[
                            Image.asset(
                              'images/online.png',
                            ),
                            GestureDetector(
                              onTap: () {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => Online()),
                                );
                              },
                              child: Text(

                                'Online Giving',
                                style: TextStyle(
                                  fontFamily: 'TT NORMS',
                                  fontSize: 18,
                                  fontWeight: FontWeight.w100,
                                  color: _isExpandedonline ? Colors.amber[800] : Colors.black,

                                ),


                              ),

                            )

                          ],


                        )),

                  ),

                  Padding(
                    padding: EdgeInsets.only(left: 10),
                    child: ExpansionTile(
                        onExpansionChanged: (value) {
                          _isExpandedpaypal=value;
                          setState(() {});
                        },
                        children: <Widget>[
                          Text(
                            'You can send your funds through PayPal to email livinghopetv@cornerstoneasianchurch.com',style: TextStyle(
                            fontSize: 14,


                          ),)
                        ],
                        title: Row(
                          children: <Widget>[
                            Image.asset(
                              'images/paypal.png',
                            ),
                            Padding(
                              padding: EdgeInsets.only(left: 10),
                              child: Text(
                                'PAYPAL',
                                style: TextStyle(

                                  fontFamily: 'TT NORMS',
                                  color:_isExpandedpaypal ? Colors.amber[800] : Colors.black,
                                  fontSize: 18,
                                  fontWeight: FontWeight.w100,
                                ),
                              ),
                            ),
                            GestureDetector(
                              onTap: () {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => paypal()),
                                );
                              },
                              child: Image.asset(
                                'images/donatebutton.png',
                                height: 33,
                              ),
                            )
                          ],
                        )),
                  ),
                  Padding(
                    padding: EdgeInsets.only(left: 10),

                    child: ExpansionTile(
                        onExpansionChanged: (value) {
                          _isExpandedetransfer=value;
                          setState(() {});
                        },
                        children: <Widget>[
                          Text(
                            'You can send your funds via Interac E-Transfer to email*',style: TextStyle(
                            fontSize: 14,


                          ),),

                          Text(
                            '
    cacoffering@gmail.com',
                            style: TextStyle(
                              color: Colors.blue,
                              fontSize: 18,

                            ),
                          ),

                          Text(
                            '
    This is an auto-deposit account
    so you you do not have to set up any password.
    Please do indicate the Purpose for your donation.
    This service is only available within Canada.',style: TextStyle(
                            fontSize: 14,


                          ),),
                        ],
                        title: Row(
                          children: <Widget>[
                            Image.asset(
                              'images/etransfer.png',
                              height: 28,
                            ),
                            Text(
                              'INTERAC E-TRANSFER',
                              style: TextStyle(

                                fontFamily: 'TT NORMS',
                                fontSize: 18,
                                fontWeight: FontWeight.w100,
                                color:_isExpandedetransfer? Colors.amber[800] : Colors.black,

                              ),
                            ),
                          ],
                        )),
                  ),
                  Padding(
                    padding: EdgeInsets.only(left: 10),
                    child: ExpansionTile(
                        onExpansionChanged: (value) {
                          _isExpandedtexttogive=value;
                          setState(() {});
                        },
                        children: <Widget>[
                          Text('STEP 1: TEXT the word GIVE to',style: TextStyle(
                            fontSize: 14,


                          ),),
                          Text(
                            '(844) 329-1637',
                            style: TextStyle(
                              color: Colors.red,
                            ),
                          ),
                          SizedBox(
                            height: 20,
                          ),
                          Text(
                            'STEP 2: Complete the information on link received via TEXT for the first time only.',style:TextStyle(
                            fontSize: 14,


                          ),),
                          SizedBox(
                            height: 20,
                          ),
                          Text(
                            'STEP 3: Once you are setup for TEXT GIVING you can continue to TEXT the amount without having to fill your information again. Simply TEXT the amounti.e 10, 15 etc to the number directly.',style: TextStyle(
                            fontSize: 14,


                          ),)
                        ],
                        title: Row(
                          children: <Widget>[
                            Image.asset(
                              'images/text.png',
                              height: 30,
                            ),
                            GestureDetector(
                              onTap: () {
                                customLaunch('sms:8443291637');
                              },
                              child: Padding(
                                padding: EdgeInsets.only(left: 10),
                                child: Text(
                                  'TEXT TO GIVE',
                                  style: TextStyle(
                                    fontSize: 18,
                                    fontWeight: FontWeight.w100,
                                    fontFamily: 'TT NORMS',
                                    color:_isExpandedtexttogive? Colors.amber[800] : Colors.black,

                                  ),
                                ),
                              ),
                            )
                          ],
                        )),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
  

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

1. Привет, у меня была такая же проблема, когда я Expanded неправильно использовал виджет. Можете ли вы поделиться своим кодом?

2. @ Yakhyo Mashrapov проверка кода

3. Просто удалите Expanded и добавьте `mainAxisSize: MainAxisSize.max` в столбец. Надеюсь, это поможет

4. @Yakhyo Mashrapov вы исправили ошибку с расширенным виджетом

Ответ №1:

Проблема в том, что вы не можете использовать Expand в качестве родительского, это означает, что расширенный виджет должен быть потомком или родителем, в режиме отладки вы можете четко видеть Incorrect Usage of Parent Widget в терминале, он будет работать в режиме отладки, но при сборке релиза он покажет пустую страницу, поэтому следите за предупреждением выше илиошибка

Неправильное использование

 child: Container(
            child:Expanded(
              child: Column(
  

пример

 Expanded(
      child: Container(),
    ),
  

В строке / столбце

 Row(
  children: [
    Expanded(
      child: MyWidget(),
    ),
    Expanded(
      child:Text("Text Widget"),
    ),
  ],
)
  

Ответ №2:

К сожалению, у этой проблемы может быть несколько причин. Для сборок Android я столкнулся с тем, что minifyEnabled, по-видимому, включен по умолчанию. Я установил

 shrinkResources false
minifyEnabled false
useProguard false
  

и сборка прошла, как ожидалось. Просто установка useProguard true и других false сократила код так же, как и раньше; из-за запутывания.
Подробнее см. https://medium.com/@swav.kulinski/flutter-and-android-obfuscation-8768ac544421

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

1. Это работает, спасибо! но есть ли альтернатива, где мы можем включить эти конфигурации?

2. Я не уверен, что вы имеете в виду «включить эти конфигурации». Это ссылка на файл gradle сборки Android. Какую альтернативу вы ищете?

Ответ №3:

когда я обновляю версию gradle с gradle-5.6.2-all до gradle-6.1.1-all и создаю gradle com.android.tools.build:gradle: 3.5.0 до com.android.tools.build:gradle: 4.0.1

Наконец, я получил решение, которое я добавил в файл app / buidl.gradle.

  buildTypes {
    release {
        signingConfig signingConfigs.debug
        shrinkResources false
        minifyEnabled false
        useProguard false
    }
}
  

Ответ №4:

Проверьте android.разрешение.ИНТЕРНЕТ в манифесте Android

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

1. #rstrelba уже добавлен, как я уже сказал, при работе над первой версией он работает нормально и успешно загружен в playstore во второй версии я просто добавил push-уведомление и пытаюсь загрузить его во вторую версию, но возникает эта проблема

Ответ №5:

Где должно быть исключение библиотеки виджетов, если вы получаете такой пустой экран в режиме выпуска или профиля. Вы можете перехватывать исключения в консоли отладки во время отладки приложения.

В вашем коде я вижу бесполезные Container и Expanded виджеты внутри SingleChildScrollView . Подумайте о том, чтобы удалить их, это должно помочь.

   @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        scrollDirection: Axis.vertical,
        child:Padding(
          padding: EdgeInsets.all(10),
          child: Column(
                children: ... 
            ),
          ),
        ),
    );
  }
  

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

1. спасибо, что ваш ответ также исправил ошибку расширенного виджета

Ответ №6:

У меня была такая же проблема, и это, конечно, моя вина. Я пробовал изменять buildconfig.release конфигурацию, разные версии gradle, удалять варианты, но это была простая асинхронная ошибка, когда данные начали отображаться до того, как они были инициализированы (извлечены).

Приложение в режиме отладки работало нормально, но в выпуске оно показывало белый экран. Ошибка полностью отличалась от реальной причины: если вы нажали на белый экран, появилось сообщение, подобное этому:

 E/flutter ( 6149): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Null check operator used on a null value
E/flutter ( 6149): #0      RenderBox.hitTest (package:flutter/src/rendering/box.dart:2234)
E/flutter ( 6149): #1      RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:2596)
E/flutter ( 6149): #2      BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:787)
E/flutter ( 6149): #3      RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:2591)
E/flutter ( 6149): #4      RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:412)