2017-12-29 17 views
1

私のアプリケーションのナビゲーションを宣言しようとしています。 MaterialAppラッパーやスタイリングを使用していないため、すべて私の輸入品はpackage:flutter/widgets.dartです。ドキュメントを1としてWidgetsAppを使用したアプリケーションナビゲーションの例

は、適切に私は、このやっているナビゲーションを使用します

import "package:flutter/widgets.dart"; 
import "package:myapp/routes/home.dart"; 

void main() { 
    runApp(
    new WidgetsApp(/* stuck here */); 
) 
} 

そして、私はこの段階で立ち往生していますが、私はIDEでNavigator docsとコードのコメントに従うことをしようとしていますが、私は理解できませんどのように使用onGenerateRouteWidgetsAppのプロパティを使用して、このオンライン、したがって質問の完全な例を見つけることができません。

new MaterialApp()と同様に、ホームパスと残りのルートをnew WidgetsApp()に定義するにはどうすればよいですか?これにフォローアップ質問として

、私はその後、switch文は、ルートと表示ページをチェックしていレイアウトにルーティングするために何とかnew WidgetsApp()/onboarding/**または/dashboard/**のようなワイルドカードのルートを使用してさせていただいておりますか!

答えて

1

onGenerateRouteプロパティを使用すると、ウィジェットアプリのルートを生成できます。ここで

は同じの非常に最小限の実装です:

import 'package:flutter/widgets.dart'; 

void main() => runApp(new MyWidgetsApp()); 

class MyWidgetsApp extends StatelessWidget { 

    Route generate(RouteSettings settings){ 
    Route page; 
    switch(settings.name){ 
     case "/": 
     page = new PageRouteBuilder(
      pageBuilder: (BuildContext context,Animation<double> animation, 
       Animation<double> secondaryAnimation){ 
       return new Column(
       mainAxisAlignment: MainAxisAlignment.center, 
       children: <Widget>[ 
        const Text("Home Page",textDirection: TextDirection.ltr,), 
        const Padding(padding: const EdgeInsets.all(10.0)), 
        new GestureDetector(
        onTap:() => Navigator.of(context).pushNamed("/first"), 
        child: new Container(
         padding: const EdgeInsets.all(10.0), 
         color:Colors.blue, 
         child: const Text("Go to First Page"), 
        ), 
       ), 
        const Padding(padding: const EdgeInsets.all(10.0)), 
        new GestureDetector(
        onTap:() => Navigator.of(context).pushNamed("/abcd"), 
        child: new Container(
         padding: const EdgeInsets.all(10.0), 
         color:Colors.blue, 
         child: const Text("Unkown Route"), 
        ), 
       ) 
       ], 
      ); 
      }, 
      transitionsBuilder: (_, Animation<double> animation, Animation<double> second, Widget child) { 
       return new FadeTransition(
       opacity: animation, 
       child: new FadeTransition(
        opacity: new Tween<double>(begin: 1.0, end: 0.0).animate(second), 
        child: child, 
       ), 
      ); 
      } 
     ); 
     break; 
     case "/first": 
     page = new PageRouteBuilder(
      pageBuilder: (BuildContext context,Animation<double> animation, 
       Animation<double> secondaryAnimation){ 
       return new Column(
        mainAxisAlignment: MainAxisAlignment.center, 
        children: <Widget>[ 
        const Text("First Page",textDirection: TextDirection.ltr,), 
        const Padding(padding: const EdgeInsets.all(10.0)), 
        new GestureDetector(
         onTap:() => Navigator.of(context).pop(), 
         child: new Container(
         padding: const EdgeInsets.all(10.0), 
         color:Colors.blue, 
         child: const Text("Back"), 
        ), 
        ) 
        ] 
      ); 
      }, 
      transitionsBuilder: (_, Animation<double> animation, Animation<double> second, Widget child) { 
       return new FadeTransition(
       opacity: animation, 
       child: new FadeTransition(
        opacity: new Tween<double>(begin: 1.0, end: 0.0).animate(second), 
        child: child, 
       ), 
      ); 
      } 
     ); 
     break; 
    } 
    return page; 
    } 

    Route unKnownRoute(RouteSettings settings){ 
    return new PageRouteBuilder(
     pageBuilder: (BuildContext context,Animation<double> animation, 
      Animation<double> secondaryAnimation){ 
      return new Column(
       mainAxisAlignment: MainAxisAlignment.center, 
       children: <Widget>[ 
       const Text("First Page",textDirection: TextDirection.ltr,), 
       const Padding(padding: const EdgeInsets.all(10.0)), 
       new GestureDetector(
        onTap:() => Navigator.of(context).pop(), 
        child: new Container(
        padding: const EdgeInsets.all(10.0), 
        color:Colors.blue, 
        child: const Text("Back"), 
       ), 
       ) 
       ] 
     ); 
     } 
    ); 
    } 

    @override 
    Widget build(BuildContext context) { 
    return new WidgetsApp(
     onGenerateRoute: generate, 
     onUnknownRoute: unKnownRoute, 
     textStyle: const TextStyle(), 
     initialRoute: "/", 
     color: Colors.red 
    ); 
    } 
} 

助けを願っています!

+0

ああ、これはMaterialAppのラッピングと比べるとかなりです。例をありがとう、私は先に進んで、それを分解する。一方、私はこのライブラリで良い選択肢を見つけました:https://github.com/goposse/fluro – Ilja

+0

あなたのバージョンは正常に実装されましたが、置き換えられたときにルートアニメーションを作成する方法を考え出すのに問題があります。私はNavigatorのapi docsに従って、そのスピンとフェードの移行を動作させました(https://docs.flutter.io/flutter/widgets/Navigator-class.html)。私が今見ている問題は、新しいルートがアニメーション化されている間、古いもの新しいものが完成するまで表示されます。理想的には、古い経路を最初にフェードアウトさせてから、新しい経路でフェードインしたいと思います。 – Ilja

+0

遷移ビルダは、あなたが試みていることを達成するために使用できる 'secondaryAnimation'引数を提供します。 [こちら](https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/routes.dart#L665)は、その実装方法です。 –

関連する問題