Je travaille sur un projet à Flutter. Le problème est que lorsque je navigue vers une page différente, puis que je reviens en arrière, il y a une icône que j'ai utilisée il y a quelque temps lors du test qui apparaît sur la barre d'applications de la page d'accueil. Je suis retourné dans le code, et il n'y avait pas de début dans la barre d'applications de cette page.

Voici une capture d'écran après une reconstruction complète de l'application.

enter image description here

Après avoir accédé à une autre page en utilisant Navigator.of(context).pushNamed('/streaks/edit/'):

enter image description here

Et enfin, revenez à la page d'accueil en utilisant Navigator.of(context).pushNamed('/streaks/all/'):

enter image description here

Code main.dart:

import 'package:flutter/material.dart';

import 'package:streaks/pages/all_streaks/all_streaks.dart';
import 'package:streaks/pages/edit_streak/edit_streak.dart';

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

class StreaksApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'streaks',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      initialRoute: '/streaks/all/',
      routes: <String, WidgetBuilder>{
        '/streaks/all/': (context) => AllStreaksPage(),
        '/streaks/edit/': (context) => EditStreakPage(),
      },
    );
  }
}

Code de la page d'accueil (/ streaks / all /):

import 'package:flutter/material.dart';

import 'streak_list.dart';

class AllStreaksPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('All Streaks'),
      ),
      body: StreakList(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
            Navigator.of(context).pushNamed('/streaks/edit/');
        },
        child: Icon(Icons.add, size: 40),
      ),
    );
  }
}

Et la page Edit Streak (/ streaks / edit /):

import 'package:flutter/material.dart';
import 'package:streaks/pages/edit_streak/streak_form.dart';

class EditStreakPage extends StatefulWidget {
  @override
  _EditStreakPageState createState() => _EditStreakPageState();
}

class _EditStreakPageState extends State<EditStreakPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
            icon: Icon(Icons.close, color: Theme.of(context).buttonColor),
            onPressed: () {
              Navigator.pushNamed(context, '/streaks/all/');
            }),
        title: Text('Edit Streak'),
      ),
      body: StreakForm()
    );
  }
}

Pubspec.yaml:

name: streaks
description: An app to boost your productivity with event organization.
publish_to: "none"
version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  sqflite:
  path:
  flutter_iconpicker: ^2.1.5

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

Remarque: à aucun moment, aucune erreur n'est enregistrée dans la console de débogage. Une autre note: même après la suppression de l'application et la réexécution, l'erreur a persisté.

Veuillez aider. Je pensais que cela pourrait être (a) une erreur de mise en cache ou (b) il y a un problème avec les widgets sans état en tant que pages.

0
Coding Carter 3 sept. 2020 à 15:49

2 réponses

Meilleure réponse

1ère façon:

Dans votre classe EditStreakPage, au lieu d'utiliser Navigator.pushNamed(context, '/streaks/all/');, utilisez Navigator.pop(context)

Code de cours complet:

import 'package:flutter/material.dart';
import 'package:streaks/pages/edit_streak/streak_form.dart';

class EditStreakPage extends StatefulWidget {
  @override
  _EditStreakPageState createState() => _EditStreakPageState();
}

class _EditStreakPageState extends State<EditStreakPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
            icon: Icon(Icons.close, color: Theme.of(context).buttonColor),
            onPressed: () {
              Navigator.pop(context); // <-- use this intead
            }),
        title: Text('Edit Streak'),
      ),
      body: StreakForm()
    );
  }
}

2ème voie:

Dans votre classe AllStreaksPage, transmettez la propriété automaticallyImplyLeading: false au AppBar()

Code de cours complet:

import 'package:flutter/material.dart';

import 'streak_list.dart';

class AllStreaksPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        automaticallyImplyLeading: false; // <--- add this
        title: Text('All Streaks'),
      ),
      body: StreakList(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
            Navigator.of(context).pushNamed('/streaks/edit/');
        },
        child: Icon(Icons.add, size: 40),
      ),
    );
  }
}
1
OMi Shah 3 sept. 2020 à 12:59

D'après ce que j'ai compris, vous dites que les actions apparaissent lorsque vous ouvrez votre application -> Page EDitStreak-> appuyez sur le bouton de fermeture en haut de la page editStreak.

La raison principale en est qu'au lieu de revenir en arrière, vous accédez en fait à cette page en y naviguant. dans lequel le bouton de retour vous ramènerait à la page de modification des séries.

Au lieu de naviguer, vous devez utiliser

Navigator.of(context).pop()

Et cela devrait résoudre votre problème, faites-le moi savoir dans les commentaires, si cela aide

1
Aman Verma 3 sept. 2020 à 13:00