【问题标题】:Flutter Navigator.pop(context) won't workFlutter Navigator.pop(context) 不起作用
【发布时间】:2021-02-06 00:33:27
【问题描述】:

我已经看到很多关于 Navigator.pop(context) 的问题,但我没有找到答案。

如您所见,到目前为止共有三个屏幕。 Navigator.pop(context) 在 StoryDe​​tailScreen 中运行良好,并将我带回 MainPage。 EditStoryScreen 页面的问题,当我进入它时,我无法返回 MainPage,当我单击 IconButton 时,我看到一个黑屏。

main.dart

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return 
    MultiProvider(
      providers: [
        ChangeNotifierProvider<Stories>(
          create: (_) =>
              Stories(),
        ),
        ChangeNotifierProvider<Story>(
          create:(ctx) => Story(),
        ),
      ],
      child: MaterialApp(
          title: 'MyShop',
          theme: ThemeData(
            primarySwatch: Colors.purple,
            accentColor: Colors.deepOrange,
            fontFamily: 'Lato',
          ),
          home: Mainpage(),
          routes: {
            StoryDetailScreen.routeName: (ctx) => StoryDetailScreen(),
            UserStory.routeName: (ctx) => UserStory(),
            EditStoryScreen.routeName: (ctx) => EditStoryScreen(),
          }),
    );
  }
}

Mainpage.dart

    
class Mainpage extends StatefulWidget {
  static const routeName = 'main';
  @override
  _MainpageState createState() => _MainpageState();
}

class _MainpageState extends State<Mainpage> {
  var _showOnlyFav = false;

  @override
  Widget build(BuildContext context) {
    final storyCon = Provider.of<Stories>(context);
    

    return Scaffold(

      body: SingleChildScrollView(
        child: Container(
          decoration: BoxDecoration(
              image: DecorationImage(
                  image: AssetImage("images/back.jpg"), fit: BoxFit.fill)),
          child: Column(children: <Widget>[
            SizedBox(
              height: 50,
            ),
            Container(
          
              child: Text("Short Stories",
                  style: TextStyle(
                      fontSize: 40, backgroundColor: Colors.grey[300])),
          
            Padding(
                padding: const EdgeInsets.all(8.0),
                child: Container(
                   
                    child: Row(
                      children: [
                        
                        Container(
                          height: 40,
                          width: 290,
                          decoration: BoxDecoration(
                              color: Colors.grey[300],
                              border: Border.all(width: 1, color: Colors.black),
                              borderRadius: BorderRadius.circular(7)
                              // image: DecorationImage(
                              //     image: AssetImage("images/text.png"))
                              ),
                          child: Center(
                            child: Row(
                              children: [
                                InkWell(
                                  onTap: () {
                                    Navigator.of(context).pushReplacementNamed(UserStory.routeName);
                                  },
                                                                  child: Text(
                                    "Edit Stroy",
                                    style: TextStyle(
                                      fontWeight: FontWeight.bold,
                                      color: Colors.black,
                                      fontSize: 30,
                                      // backgroundColor: Colors.grey[300]),
                                    ),
                                  ),
                                ),
                                InkWell(
                                  onTap: () {
                                    Navigator.of(context).pushReplacementNamed(EditStoryScreen.routeName);
                                  },
                                                                  child:Text(
                                  "Add Stroy",
                                  style: TextStyle(
                                    fontWeight: FontWeight.bold,
                                    color: Colors.black,
                                    fontSize: 30,
                                    // backgroundColor: Colors.grey[300]),
                                  ),
                                ),)
                                
                              ],
                            ),
                          ),
                        ),
                      ],
                    ))),
            StorysGrid(_showOnlyFav),
          ]),
        ),
      ),
    );
  }
}

EditStoryScreen.dart

class EditStoryScreen extends StatefulWidget {
  static const routeName = 'edit';
  

  @override
  _EditStoryScreenState createState() => _EditStoryScreenState();
}

class _EditStoryScreenState extends State<EditStoryScreen> {
  final _storyFocusNode = FocusNode();
  final _imgController = TextEditingController();
  final _imgFocusNode = FocusNode();

  @override
  void initState() {
    _imgFocusNode.addListener(updateImg);
    super.initState();
  }

  @override
  void dispose() {
    _imgFocusNode.removeListener(updateImg);
    _storyFocusNode.dispose();
    _imgController.dispose();
    _imgFocusNode.dispose();
    super.dispose();
  }

  void updateImg() {
    if (!_imgFocusNode.hasFocus) {
      setState(() {});
    }
  }
  // void backToHome(context) {
  //   Navigator.pushReplacementNamed(BuildContext(), context);
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Container(
          height: 650,
          color: Colors.white,
          child: Column(
            children: [
              SizedBox(
                height: 30,
              ),
              Align(
                  alignment: Alignment.topLeft,
                  child: RaisedButton(
                      child: Icon(Icons.arrow_back_ios),
                      onPressed: () => Navigator.pop(context)
                      
                      )),
              Padding(
                padding: const EdgeInsets.fromLTRB(15, 10, 15, 15),
                child: Form(
                  child: ListView(
                    shrinkWrap: true,
                    children: <Widget>[
                      TextFormField(
                        decoration: InputDecoration(labelText: "Title"),
                        textInputAction: TextInputAction.next,
                        onFieldSubmitted: (_) {
                          FocusScope.of(context).requestFocus(_storyFocusNode);
                        },
                      ),
                      TextFormField(
                        decoration: InputDecoration(labelText: "Story's text"),
                        maxLines: 14,
                        keyboardType: TextInputType.multiline,
                        focusNode: _storyFocusNode,
                      ),
                      Row(
                        children: [
                          Container(
                            width: 100,
                            height: 100,
                            margin: EdgeInsets.only(top: 8, right: 10),
                            decoration: BoxDecoration(
                              border: Border.all(width: 1, color: Colors.grey),
                            ),
                            child: _imgController.text.isEmpty
                                ? Text("Enter a Url")
                                : Center(
                                    child: FittedBox(
                                      child: Image.network(
                                        _imgController.text,
                                      ),
                                    ),
                                  ),
                          ),
                          Container(
                            width: 200,
                            child: TextFormField(
                              decoration: InputDecoration(
                                labelText: "Image URL",
                              ),
                              keyboardType: TextInputType.url,
                              textInputAction: TextInputAction.done,
                              controller: _imgController,
                              focusNode: _imgFocusNode,
                            ),
                          )
                        ],
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

StoryDe​​tailScreen.dart

class StoryDetailScreen extends StatelessWidget {
  // final String title;
  // final double price;

  // ProductDetailScreen(this.title, this.price);
  static const routeName = '/story-detail';

  @override
  Widget build(BuildContext context) {
    final storyId =
        ModalRoute.of(context).settings.arguments as String; // is the id!
    final loadedStory = Provider.of<Stories>(
      context,
      listen: false,
    ).findById(storyId);
    return Scaffold(
      body: SingleChildScrollView(
        child: Container(
          width: double.infinity,
          // height: 700,
          decoration: BoxDecoration(
              image: DecorationImage(
                  image: AssetImage("images/back1.jpg"), fit: BoxFit.fill)),
          // color: Color(0xfffae3d9),
          // child: Column(children: <Widget>[
          //   SizedBox(
          //     height: 10,
          //   ),
          //   Container(
          //     width: 340,
          child:
              Column(crossAxisAlignment: CrossAxisAlignment.center, children: [
            SizedBox(
              height: 50,
            ),
            Align(
                alignment: Alignment.topLeft,
                child: RaisedButton(
                  
                  child: Icon(Icons.arrow_back_ios),
                  onPressed: (){
                    Navigator.pop(context);

                })
              ),

            Card(
              elevation: 10,
              margin: EdgeInsets.all(10),
              child: Text("${loadedStory.title}",
                  softWrap: false,
                  textDirection: TextDirection.ltr,
                  style: TextStyle(
                    color: Color(0xFF6a2c70),
                    decorationColor: Colors.black,
                    fontSize: 25,
                    fontWeight: FontWeight.bold,
                  )),
            ),
            SizedBox(height: 30),

            Container(
              width: double.infinity,
              color: Colors.white70,
              child: Padding(
                padding:
                    const EdgeInsets.symmetric(vertical: 10, horizontal: 5),
                child: Text(
                  loadedStory.story,
                  textDirection: TextDirection.rtl,
                  style: TextStyle(
                    color: Color(0xFF6a2c70),
                    decorationColor: Colors.black,
                    fontSize: 25,
                    fontWeight: FontWeight.bold,
                    // fontFamily: "Kufam"),
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 20,
            ),
            Card(
              child: Container(
                height: 60,
                width: 210,
                decoration: BoxDecoration(color: Colors.white60),
                child: Center(
                  child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      crossAxisAlignment: CrossAxisAlignment.end,
                      children: [
                        Like(),
                      ]),
                ),
              ),
            ),

            // ],

            // )
            SizedBox(
              height: 30,
            )
          ]),
        )
        // ]
        ,
      ),
      // ),
      // ),
    );
  }
}

【问题讨论】:

  • 你为什么使用推送替换为什么不只推送页面而不是替换它

标签: flutter dart


【解决方案1】:

你正在调用

Navigator.of(context).pushReplacementNamed(UserStory.routeName)

所以这是从导航堆栈中删除您的Mainpage 并用UserStory 替换它,这就是为什么当您调用Navigator.pop(context) 时,没有什么可以返回,您得到的只是黑屏。

将其更改为Navigator.of(context).pushNamed(UserStory.routeName)

【讨论】:

    【解决方案2】:

    您还必须在路由中定义Mainpage 路由。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2019-05-12
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2022-01-25
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多