Как остановить запуск функций на предыдущей странице флаттера? - PullRequest
0 голосов
/ 02 мая 2020

Я новичок во Флаттере. Я использую RouterGenerator следующим образом.

import 'package:flutter/material.dart';

import '../AdmobPage.dart';
import '../BonusPage.dart';
import '../HomePage.dart';

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    // Getting arguments passed in while calling Navigator.pushNamed

    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (_) => MyHomePage());
      case '/login':
        return MaterialPageRoute(builder: (_) => LoginPage());
      case '/admob':
        return MaterialPageRoute(builder: (_) => AdmobPage());
      default:
        // If there is no such named route in the switch statement, e.g. /third
        return _errorRoute();
    }
  }

  static Route<dynamic> _errorRoute() {
    return MaterialPageRoute(builder: (_) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Error'),
        ),
        body: Center(
          child: Text('ERROR'),
        ),
      );
    });
  }
}

Когда я открываю свое приложение, домашняя страница открывается без каких-либо проблем. У меня есть некоторые службы http на других страницах, например на AdmobPage. Когда я go на этой странице, мои http-сервисы работают нормально.

Но моя проблема здесь начинается. Когда я нажимаю HomePage в меню, все мои сервисы на AdmobPage снова работают. Я не мог найти в чем проблема. Мой пример AdmobPage такой:

import 'dart:convert';

import 'package:doordie/utils/Functions.dart';
import 'package:doordie/utils/UIData.dart';
import 'package:doordie/widgets/CommonScaffold.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:getflutter/getflutter.dart';
import 'package:http/http.dart' as http;

import 'LoginPage.dart';

class AdmobPage extends StatefulWidget {
  @override
  _AdmobPageState createState() => _AdmobPageState();
}

class Prizes {
  final int id;
  final String name;
  final String subtitle;
  final String photo;
  final String url;
  final int coin;
  final String status;

  Prizes(
      {this.id,
      this.name,
      this.subtitle,
      this.photo,
      this.url,
      this.coin,
      this.status});

  factory Prizes.fromJson(Map<String, dynamic> json) {
    return Prizes(
      id: json['id'],
      name: json['name'],
      subtitle: json['subtitle'],
      photo: json['photo'],
      url: json['url'],
      coin: json['coin'],
      status: json['status'],
    );
  }
}

class _AdmobPageState extends State<AdmobPage> {
  var deviceSize;

  int status;

  Future<List<Prizes>> fetchPrizes() async {
    final storage = new FlutterSecureStorage();
    String accessToken = await storage.read(key: "accessToken");
    List<Prizes> list;

    final response = await http.get(UIData.apiUrl + 'users', headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer ' + accessToken,
    });
    if (response.statusCode == 200) {

      var res = await http.get(
          UIData.apiUrl + 'paymentmethods?status=1',
          headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Authorization': 'Bearer ' + accessToken,
          });
      if (res.statusCode == 200) {
        var data = json.decode(res.body);
        var rest = data["data"] as List;
        list = rest.map<Prizes>((json) => Prizes.fromJson(json)).toList();
      }
      return list;
    } else {
      throw Exception('Failed to load photos');
    }
  }

  @override
  Widget build(BuildContext context) {
    deviceSize = MediaQuery.of(context).size;
    return FutureBuilder(
        future: checkAuthenticated(),
        builder: (context, snapshot) {
          return snapshot.data ?? true ? _scaffold() : LoginPage();
        });
  }

  Widget getPrizesList(List<Prizes> prize) {
    return Container(
      height: deviceSize.height - 150,
      child: ListView.builder(
          physics: const AlwaysScrollableScrollPhysics(),
          scrollDirection: Axis.vertical,
          shrinkWrap: true,
          itemCount: prize.length,
          padding: EdgeInsets.zero,
          itemBuilder: (context, position) {
            return GFCard(
              boxFit: BoxFit.cover,
              image: Image.asset(prize[position].photo),
              content: Text(prize[position].name),
              buttonBar: GFButtonBar(
                alignment: WrapAlignment.center,
                children: <Widget>[
                  GFButton(
                    onPressed: () {},
                    text: 'Min 50 Coin',
                    color: Colors.blueGrey.shade800,
                  ),
                ],
              ),
            );
          }),
    );
  }

  Widget bodyData() {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          FutureBuilder(
              future: fetchPrizes(),
              builder: (context, snapshot) {
                return snapshot.data != null
                    ? getPrizesList(snapshot.data)
                    : Center(child: CircularProgressIndicator());
              })
          //CommonDivider(),
        ],
      ),
    );
  }

  Widget _scaffold() => CommonScaffold(
        backGroundColor: Colors.grey.shade100,
        actionFirstIcon: null,
        appTitle: "MyApp",
        showFAB: true,
        //scaffoldKey: _scaffoldState,
        showDrawer: true,
        centerDocked: true,
        floatingIcon: Icons.gamepad,
        bodyData: bodyData(),
        showBottomNav: true,
      );
}

Как перестать запускать функции снова на предыдущих страницах, когда я меняю страницу?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...