Skyost / RateMyApp

This plugin allows to kindly ask users to rate your app if custom conditions are met (eg. install time, number of launches, etc...).

Home Page:https://pub.dev/packages/rate_my_app

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

The Rate dialog is shown after every restart even after calling `callEvent(RateMyAppEventType.rateButtonPressed)`

mendelg opened this issue · comments

The bug
To avoid the dialog from appearing we can call:

 await rateMyApp.callEvent(RateMyAppEventType.rateButtonPressed);

However, despite calling it in my code, the dialog still appears after doing a Hot Restart.

My code;

TextButton(
              child: Text('OK'),
              onPressed: () async {
                stars = stars ?? 0;

                if (stars! < 4) {
                  Navigator.of(context, rootNavigator: true).pop();
                 // --> I'm calling this here, so the dialog shouldn't appear again.
                  await _rateMyApp
                      .callEvent(RateMyAppEventType.rateButtonPressed);
)

Complete code (not really runnable)
import 'package:expansion_tile_card/expansion_tile_card.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/adapters.dart';
import 'package:mishnayos_project/widgets/expansion_tile_card.dart';
import 'package:mishnayos_project/models/word.dart';
import 'package:mishnayos_project/providers/api_service.dart';

import 'package:rate_my_app/rate_my_app.dart';

import '../constants/colors.dart';

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  var isLoaded = false;
  late Box<Word> wordBox;
  late Box<Word> favoritesBox;
  late Box<String> lastRefreshedBox;
  final _scrollController = ScrollController();
  final _rateMyApp = RateMyApp(
    preferencesPrefix: 'rateMyApp_',
    minDays: 0,
    minLaunches: 0,
    remindDays: 2,
    remindLaunches: 3,
    googlePlayIdentifier: 'com.mendelg.otzar_roshei_teivot2',
    appStoreIdentifier: "6444920898",
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: KscaffoldBackgroundColor,
        body: SafeArea(
            child: RefreshIndicator(
                color: Theme.of(context).primaryColor,
                onRefresh: () async {
                  await _onRefresh();
                },
                child: Scrollbar(
                  thickness: 5,
                  controller: _scrollController,
                  isAlwaysShown: true,
                  child: ListView.builder(
                      controller: _scrollController,
                      physics: AlwaysScrollableScrollPhysics(),
                      itemBuilder: (context, index) {
                        return ValueListenableBuilder(
                            valueListenable:
                                Hive.box<Word>('words').listenable(),
                            builder: (context, Box<Word> words, _) {
                              final word = words.getAt(index);
                              if (index == 0) {
                                return Column(
                                  children: [
                                    Text(
                                      "Pull down to refresh",
                                      style: TextStyle(
                                          color: Colors.blueGrey, fontSize: 18),
                                    ),
                                    _buildExpansionTileCard(word!)
                                  ],
                                );
                              }
                              return _buildExpansionTileCard(word!);
                            });
                      },
                      itemCount: wordBox.length),
                ))));
  }

  @override
  void initState() {
    super.initState();
    wordBox = Hive.box<Word>("words");
    favoritesBox = Hive.box<Word>("favorites");
    lastRefreshedBox = Hive.box<String>("lastRefreshed");

    _rateMyApp.init().then((_) {
      _rateMyApp.showStarRateDialog(
        context,
        title: 'Enjoying Otzar Roshei Teivot?',
        message: 'Please leave a rating!\n it really helps us out!',
        actionsBuilder: (_, stars) {
          return [
            TextButton(
              child: Text('OK'),
              onPressed: () async {
                stars = stars ?? 0;

                if (stars! < 4) {
                  Navigator.of(context, rootNavigator: true).pop();

                  await _rateMyApp
                      .callEvent(RateMyAppEventType.rateButtonPressed);
                } else {
                  Navigator.of(context, rootNavigator: true).pop();

                  await _rateMyApp
                      .callEvent(RateMyAppEventType.rateButtonPressed);

                  if (await _rateMyApp.isNativeReviewDialogSupported == false) {
                    await _rateMyApp.launchNativeReviewDialog();
                  } else {
                    await _rateMyApp.launchStore();
                  }
                }
              },
            ),
          ];
        },
        ignoreNativeDialog: true,
        starRatingOptions: StarRatingOptions(),
        onDismissed: () =>
            _rateMyApp.callEvent(RateMyAppEventType.laterButtonPressed),
      );
    });
  }

  dispose() {
    _scrollController.dispose();
    super.dispose();
  }

}

Expected behavior
The expected behavior should be that the dialog shouldn't appear, since I have mimicked a rateButtonPressed event.

Note
I think the problem might be with the way I'm dismissing the Dialog, I'm using:

Navigator.of(context, rootNavigator: true).pop();

Instead of:

Navigator.pop<RateMyAppDialogButton>(context, RateMyAppDialogButton.rate);

But I'm using Navigator.of(context, rootNavigator: true).pop() since Popping the other way is popping my BottomNavigationBar, and it isn't popping the RatingBar.

Okay, here was the problem:I forgot to call:

_rateMyApp.shouldOpenDialog
As the name implies, this checks whether the dialog is meant to be opened. But I was calling the dialog no matter what.