J'ai un écran (ProductAddScreen.dart) qui essaie de charger les données de Firestore (produits non publiés) mais si la liste est vide, je souhaite rediriger vers un nouvel écran (ProductFormScreen.dart).

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<Product>>(
      stream: context.watch<ProductService>().unpublished(),
      initialData: [],
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Loading(color: Colors.green);
        }

        // ════════ Exception caught by widgets library ════════
        // setState() or markNeedsBuild() called during build.

        if (!snapshot.hasData) {
          Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => ProductFormScreen()));
        }

        return Scaffold(
          appBar: AppBar(
            title: Text(Strings.productAddAppBarTitle),
          ),
          body: ListView.separated(
            itemBuilder: (context, index) {
              final product = snapshot.data[index];
              return ProductItemRow(
                product: snapshot.data[index],
                onTap: () => print('hello'),
              );
            },
            separatorBuilder: (context, index) => Divider(height: 0),
            itemCount: snapshot.data.length,
          ),
        );
      },
    );
  }

Je viens de react js et je pense que je suis confus. Comment puis-je faire cela avec Flutter?

1
Feloo 22 oct. 2020 à 22:17

3 réponses

Meilleure réponse

Comme l'erreur indique que vous essayez de naviguer pendant la construction;

Pour éviter cela, vous pouvez utiliser le rappel de post build:

WidgetsBinding.instance.addPostFrameCallback((_) {
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => ProductFormScreen()));
});
1
Nuts 22 oct. 2020 à 19:39
Future navigateToSubPage(context) async {
  Navigator.push(context, MaterialPageRoute(builder: (context) => SubPage()));

Exemple de code pour vérifier que la liste est vide

return _items.isEmpty ? Center(child: Text('Empty')) : ListView.builder(
  itemCount: _items.length,
  itemBuilder: (context, index) {
    return _buildFilteredItem(context, index);
  },
)
    }
0
Ashok 22 oct. 2020 à 19:42
if(snapshot.hasData){
   if(snapshot.data.yourList.length == 0){
       Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => 
       ProductFormScreen()));
   }
   return Scaffold(
       //your design
   );
}

Remarque: - Dans votre modèle, initialisez votre liste comme

List<YourListObject> list = [];
0
Arpit Awasthi 22 oct. 2020 à 19:37