flutter ProgressDialog, похоже, имеет поля c, которые влияют на все экземпляры - PullRequest
0 голосов
/ 06 марта 2020

У меня возникли проблемы, когда ProgressDialog не работает во время выполнения. Есть несколько проблем, но самая большая проблема заключается в том, что при правильных обстоятельствах ProgressDialog не закроется, когда вызывается dismiss. Вместо этого я вижу запись в журнале "ProgressDialog уже удален". Как только это происходит, приложение останавливается с вращением ProgressDialog.

Мое тестирование показывает, что предыдущие действия кровоточат и влияют на все экземпляры ProgressDialog, даже если я создаю новые экземпляры ProgressDialog, когда я хочу его использовать.

Приложение - это самое маленькое приложение, которое я могу построить, чтобы показать проблему. В этом примере dismiss работает, но как только поле 'message' установлено в одном экземпляре, оно перетекает в другой экземпляр, где 'message' не установлено.

Любое понимание будет высоко оценено.

import 'dart:async';
import 'package:progress_dialog/progress_dialog.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage() ;

  @override
  Widget build(BuildContext context) {
    final test1Button = Material(
      borderRadius: BorderRadius.circular(30.0),
        color: Color(0xff01A0C7),
      child: MaterialButton(
        onPressed: () {
          print("Test1");
          final ProgressDialog pr = new ProgressDialog(context);
          pr.style(message: "Test 01");
          pr.show();
          new Timer(Duration(seconds: 3), () {
                pr.dismiss();
          });
        },
        child: Text("Test 01"),
      ),
    );
    final test2Button = Material(
      borderRadius: BorderRadius.circular(30.0),
      color: Color(0xff01A0C7),
      child: MaterialButton(
        onPressed: () {
          final ProgressDialog pr = new ProgressDialog(context);
          pr.show();
          new Timer(Duration(seconds: 3), () {
            pr.dismiss();
          });
        },
        child: Text("Test 02"),
          ),
        );

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            test1Button,
            test2Button,
          ],
        ),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 06 марта 2020

Хорошо, когда вы проверяете диалог прогресса исходный код , вы устанавливаете, что:

  1. ProgressDialog класс имеет только одну переменную-член, и это диалоговое окно:
class ProgressDialog {
  _Body _dialog;
Любые параметры, которые вы передаете конструктору ProgressDialog или style, не влияют на экземпляр ... но переопределяют переменные верхнего уровня!
String _dialogMessage = "Loading...";

class ProgressDialog {
  _Body _dialog;

  void style({
      String message,
      }) {
    _dialogMessage = message ?? _dialogMessage;
  }
}

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

Так что да, ваши подозрения были верны: ProgressDialog на самом деле есть stati c поля, которые влияют все экземпляры.

...