2017-12-29 28 views
1

내 앱 탐색을 선언하려고합니다. MaterialApp 래퍼 또는 스타일을 사용하지 않으므로 모든 수입품은 package:flutter/widgets.dart에서옵니다. 문서 당으로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() 내 홈 경로와 나머지 경로를 정의하는 방법은 무엇입니까? 이에 대한 후속 질문으로

, 나는 경로 표시 페이지를 확인 후 스위치 문이 레이아웃에 어떻게 든 경로에 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' 인수를 제공합니다. [Here] (https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/routes.dart#L665)는 구현 방법입니다. –