Flutter导航器,使用PageRouteBuilder进行水平转换

4
我正在尝试在Flutter Navigator Widget中强制进行水平转换。Navigator使用平台默认的屏幕切换方式。在iOS中,转换是从右到左。从左到右弹出。在Android中,它是从底部到顶部。我认为解决方案是使用PageRouteBuilder,但没有成功使其工作。我用Navigator Widget标记了要修改的方法,以使用PageRouteBuilder获取所需的水平转换。
代码片段2是我一直在尝试使其工作的转换代码。

这段代码作为默认转换是有效的。

import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
      initialRoute: "/",
      routes: {
        '/Second': (context) => SecondScreen(),
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ButtonMaterial02(),
            new Text('NAV DEMO...',),
            new Text('How do I get a Horizontal Transition in Android?',),
          ],
        ),
      ),
 // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

//================================================================
//================================================================
  Padding ButtonMaterial02() {
    return Padding(
            padding: const EdgeInsets.all(18.0),
            child: new MaterialButton(
              onPressed: MatButton02_onPress,
              child: new Text("Material Button 02"),
              padding: EdgeInsets.all(50.0),
              minWidth: double.infinity,
              color: Theme.of(context).primaryColor,
            ),
          );
  }

  //  add Horizontal code here
  void MatButton02_onPress() {
              print(" MaterialButton02 onPressed...");
              Navigator.pushNamed(context, '/Second');
    //*************************************************
    //*************************************************
    //  HOW do I replace the Navigator above to use
    //  PageRouteBuilder so I can force ANDROID to
    //  Transition Right to Left instead of BottomToTop?
    //*************************************************
    //*************************************************
            }
}

//================================================================
//================================================================
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Screen"),
      ),
      body: Center(
        child: RaisedButton(
          child: new Text("RETURN"),
          onPressed: (){
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}
//================================================================
//================================================================

代码片段2... 我一直在尝试使用的过渡代码。

  transitionsBuilder: (
      BuildContext context, 
      Animation<double> animation,
      Animation<double> secondaryAnimation, 
      Widget child) {
        return SlideTransition(
          position: new Tween<Offset>(
          begin: const Offset(1.0, 0.0),
          end: Offset.zero,
         ).animate(animation),
        child: new SlideTransition(
        position: new Tween<Offset>(
          begin: Offset.zero,
          end: const Offset(1.0, 0.0),
        ).animate(secondaryAnimation),
        child: child,
      ),
    );
  },
);
Navigator.of(context).push('Second');
1个回答

3
您希望使用 CupertinoPageRoute,它会从右向左播放动画,旨在模拟iOS的转场动画。请按照此处示例,将MaterialPageRoute引用替换为CupertinoPageRoute即可!

啊啊啊... 真是太简单了。现在我需要弄清楚Cupertino还能做些什么。谢谢。 - IrishGringo
没问题!有很多东西都标记了材料,可以简单地用Cupertino替换,比如CupertinoButton。 - ThinkDigital
你能否看一下这个问题...关于Cupertino导航的后续。https://dev59.com/ZFUK5IYBdhLWcg3wjgft - IrishGringo
我看了一下,但不幸的是我不知道你问题的答案。 - ThinkDigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接