Провайдер Flutter (web) не работает в выпущенном режиме, но работает в режиме отладки - PullRequest
0 голосов
/ 19 марта 2020

Я испытываю странное поведение, когда провайдер ведет себя по-разному в режиме отладки и выпуска.

Этот вопрос опубликован в этом вопросе .

Здесь краткое описание функциональности: у меня есть список ExpansionTiles (содержащий TextFormFields в их теле) и FloatingActionButton, который добавляет в список ExpansionTiles. Под этими двумя виджетами у меня есть одна кнопка «Назад» и одна кнопка «Далее». Кнопка «Далее» должна быть «недоступна» (ie. Выдает пользователю сообщение об ошибке и имеет серый цвет), пока какой-либо TextFormField в списке ExpansionTiles является неполным. Когда все TextFormFields готовы, кнопка «Далее» должна изменить цвет и направить пользователя на новую страницу. Изменение цвета и функциональности прекрасно работает в режиме отладки, но не в режиме выпуска (ie. После запуска: flutter build web).

Во-первых: TravelProceedModel отслеживает состояние того, может ли пользователь нажать кнопку Далее или не. Ie. это просто простой бул. Всякий раз, когда вызывается updateCanProceed (), я обновляю canProceed, а также notifyListeners ().

import 'package:flutter/material.dart';

class TravelProceedModel extends ChangeNotifier {

  bool canProceed;

  void updateCanProceed(bool value) {

    canProceed = value;

    notifyListeners();
  }
}

Во-вторых, TravelProceedModel реализуется с использованием ChangeNotifierProvider, а затем с использованием Consumer. Я ожидаю (и это работает в отладке), что, когда canProceed изменяется, эта строка: «nextEnabled: continueModel.canProceed» должна вызывать изменение цвета кнопки. Однако это работает только в режиме отладки.

class TravelDeductionTrips extends StatefulWidget {
  @override
  _TravelDeductionTripsState createState() => _TravelDeductionTripsState();
}

class _TravelDeductionTripsState extends State<TravelDeductionTrips> {

@override
Widget build(BuildContext context) {
  String year = Provider.of<UserSelectionsModel>.(context).selected_report["year"];
  String report = Provider.of<UserSelectionsModel>(context).selected_report["report"];

  return MultiProvider(
    providers: [
     ChangeNotifierProvider(
       create: (context) => TravelProceedModel()
     ),
     ChangeNotifierProvider(
       create: (context) => TravelModel(
         year: year,
         report: report,
       ),
     ),
    ],
    child: Consumer<TravelModel>(
      builder: (context, travelModel, child) {
       return FutureBuilder(
         future: travelModel.fetchTripsToLocalSession(),
         builder: (context, data) {
           if (data.connectionState == ConnectionState.done) {
             return Column(
               children: <Widget>[
                 TravelDeductionTripList(),
                 Consumer<TravelProceedModel>(
                   builder: (context, proceedModel, child) {
                     proceedModel.updateCanProceed(
                       travelModel.checkProceedCondition()
                     );
                     return BackNextButtons(
                       backEnabled: true,
                       nextEnabled: proceedModel.canProceed,
                       backText: "Tilbage",
                       nextText: travelModel.trips["next_action_title"],
                       errorMessage: travelModel.proceedErrorMessage,
                       nextFunction: () async {
                         await addQuestionIDtoStack(year, report, travelModel.trips["next_question_id"], true);
                       }, // No special function is needed, this is just a simple next
                     );
                   },
                 ),
               ],
             );
           } else {
             return Center(
               child: CircularProgressIndicator(),
             );
           }
         }
      );
    }
  ),
);
}
}

Внимание! continueModel.canProceed обновляется из TravelDeductionTripList (), который вызывает

Provider.of<TravelProceedModel>(context, listen: false).updateCanProceed(
  Provider.of<TravelModel>(context, listen: false).checkProceedCondition()
);

Кнопка «Далее» меняет цвета только после перезагрузки виджета. Ie. Похоже, что TravelProceedModel обновляется, но виджет не перерисовывается в пользовательском интерфейсе - хотя это прекрасно происходит в режиме отладки.

Кто-нибудь знает, почему отладка работает, а выпуск - нет?

Ниже мой "доктор-флаттер -v". Обратите внимание, что это веб-проект флаттера.

[✓] Flutter (Channel beta, v1.15.17, on Mac OS X 10.15.2 19C57, locale en-US)
    • Flutter version 1.15.17 at /Users/danni/Documents/flutter/flutter
    • Framework revision 2294d75bfa (13 days ago), 2020-03-07 00:28:38 +0900
    • Engine revision 5aff311948
    • Dart version 2.8.0 (build 2.8.0-dev.12.0 9983424a3c)


[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/danni/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✗] Xcode - develop for iOS and macOS
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS development.
      Download at: https://developer.apple.com/xcode/download/
      Or install Xcode via the App Store.
      Once installed, run:
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
        sudo xcodebuild -runFirstLaunch
    ✗ CocoaPods installed but not working.
        You appear to have CocoaPods installed but it is not working.
        This can happen if the version of Ruby that CocoaPods was installed with is different from the one being used
        to invoke it.
        This can usually be fixed by re-installing CocoaPods. For more info, see
        https://github.com/flutter/flutter/issues/14293.
      To re-install CocoaPods, run:
        sudo gem install cocoapods

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 3.5)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 41.0.2
    • Dart plugin version 191.8593
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] VS Code (version 1.43.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.8.1

[✓] Connected device (2 available)
    • Chrome     • chrome     • web-javascript • Google Chrome 80.0.3987.149
    • Web Server • web-server • web-javascript • Flutter Tools

! Doctor found issues in 1 category.
...