【问题标题】:Navigator.push(...) works only when called twiceNavigator.push(...) 仅在调用两次时有效
【发布时间】:2023-02-08 19:59:35
【问题描述】:

我有一个推送新屏幕的小部件,在新屏幕中我再次使用 Navigator 推送一个新屏幕。

屏幕 1 - 有状态的小部件,在点击元素时调用此函数:

  void goToBreedScreen() {
    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) => BreedCategoryScreen(
                  onBreedPicked: (DomainBreedCategory val) {
                    setState(() {
                      breed = val;
                    });
                  },
                  currentSelectedBreed: breed,
                  allBreeds: allBreeds,
                )));
  }


屏幕2——看goTo()函数,只要我调用Navigator.push()两次就会出现新的屏幕。但不是当它被调用一次?

import 'package:fe/screens/task/choice_card.dart';
import 'package:flutter/material.dart';

import '../../../common/custom_app_bar.dart';
import '../../../model/domain_breed_category.dart';
import '../../task/breed_avatar.dart';
import 'breed_choice_screen.dart';

class BreedCategoryScreen extends StatefulWidget {
  final Function onBreedPicked;
  final List<DomainBreedCategory> allBreeds;
  final DomainBreedCategory? currentSelectedBreed;

  const BreedCategoryScreen(
      {Key? key,
      required this.onBreedPicked,
      this.currentSelectedBreed,
      required this.allBreeds})
      : super(key: key);

  @override
  State<BreedCategoryScreen> createState() => _BreedCategoryScreenState();
}

class _BreedCategoryScreenState extends State<BreedCategoryScreen> {


 
  void goTo(){
    // Navigator.push(
    //     context,
    //     MaterialPageRoute(
    //       builder: (context) =>  const Scaffold(
    //         body: Text('bla'),
    //       ),
    //     ));
    Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) =>  const Scaffold(
            body: Text('bla'),
          ),
        ));
  }



  List<Widget> getCategories(BuildContext context) {
    widget.allBreeds.sort((a, b) => a.name[0].compareTo(b.name[0]));
    return widget.allBreeds
        .map((DomainBreedCategory e) => Padding(
              padding: const EdgeInsets.symmetric(vertical: 3),
              child: ChoiceCard(
                  onTapped: () {
                    goTo();
                  },
                  avatar: BreedAvatar(
                    name: e.name,
                    size: 25.0,
                  ),
                  label: e.name,
                  isSelected: widget.currentSelectedBreed != null &&
                      widget.currentSelectedBreed?.id == e.id),
            ))
        .toList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(
        title: 'Breed category',
      ),
      body: SafeArea(
        child: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 20),
            child: Column(
              children: getCategories(context),
            ),
          ),
        ),
      ),
    );
  }
}

可能是什么原因呢?

【问题讨论】:

  • 你为什么要从Screen 1传递BuildContext?在调用 Navigator.push 时,您应该使用 _BreedCategoryScreenStatecontext 以按预期工作。
  • 好吧,这只是我用作测试的一些答案,有一些答案暗示原因是错误的上下文)我现在将更新上面的代码,没有传递上下文,但它仍然无法正常工作
  • 当我调用 push 两次时,行为仍然是 push 只起作用

标签: ios flutter dart


【解决方案1】:

我只是假设这一点,但我说问题是您使用了错误的上下文,请尝试像这样制作 goTo()

    void goTo(BuildContext context){ // this context will be used
    // Navigator.push(
    //     context,
    //     MaterialPageRoute(
    //       builder: (context) =>  const Scaffold(
    //         body: Text('bla'),
    //       ),
    //     ));
    Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) =>  const Scaffold(
            body: Text('bla'),
          ),
        ));
  }

然后当你打电话给它时:

goTo(context);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多