トピックについて何時間も検索した後、Flutter Webのドキュメントが不足しているため、この質問をしています。
フラッターを使用するWebアプリを作成しようとしていて、以下のようなURLが必要でした
website.com/user/someUserCode
が呼び出され、データ(someUserCode
)がページに渡されるページが起動されます
しかし、それを解決するための解決策はまだありません。
全部切り上げるだけで
(get/post)メソッドを使用してデータを渡し、Webアプリをフラッターする方法
編集1
私が知っているすべて/まだ試したこと
以下のコードを使用して、一部のパラメーターが一部のクラスファイルに読み込まれているかどうか
final Map<String, String> params = Uri.parse(html.window.location.href).queryParameters;
String data = params["userData"];
これで実際に私の質問のFetch
部分が解決されます(多分)
ただし、そのデータがURL経由でページに渡される部分はまだありません。
編集2
返信がなく、何も見つからなかったので、Flutter GitHubページでチケットを上げました here
同じ問題を探している他の人はそれを追跡できます(解決された場合)
onGenerateRoute
からすべて(パス、パラメーターなど)を取得できます。 Home
は_/
_になり、そこからのすべてを取得してユーザーのリダイレクトに使用できます。
これを解決するための私のアプローチは次のとおりです。あなたのベースApp()
は次のようになります:
_class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Website Title',
onGenerateRoute: (settings) => NavigatorRoute.route(settings.name),
);
}
}
_
そしてclassNavigatorRoute
は次のようになります:
_class NavigatorRoute extends StatefulWidget {
final String path;
static Route<dynamic> route(String path) {
return SimpleRoute(
name: '', // this one is always empty as you didn't route yet
title: 'Website Title',
builder: (_) => NavigatorRoute(path: path),
animated: false
);
}
const NavigatorRoute({Key key, this.path}) : super(key: key);
@override
_NavigatorRouteState createState() => _NavigatorRouteState();
}
class _NavigatorRouteState extends State<NavigatorRoute> {
@override
void initState() {
super.initState();
Future.delayed(Duration(milliseconds: 0), () {
if (widget.path == '/') {
Navigator.of(context).pushAndRemoveUntil(HomeScreen.route(false), (_) => false);
return;
} else if (widget.path == '/user') {
Navigator.of(context).pushAndRemoveUntil(UserScreen.route(false), (_) => false);
return;
} else if (widget.path.contains('/user/')) {
Navigator.of(context).pushAndRemoveUntil(UserScreen.routeCode(widget.path.split('/')[2]), (_) => false);
return;
} else if (widget.path == '/about') {
Navigator.of(context).pushAndRemoveUntil(AboutScreen.route(), (_) => false);
return;
} else {
Navigator.of(context).pushAndRemoveUntil(HomeScreen.route(), (_) => false);
return;
}
});
}
@override
Widget build(BuildContext context) {
return SizedBox();
}
}
_
SimpleRoute
のコードは次のとおりです。
_class SimpleRoute extends PageRoute {
SimpleRoute({@required String name, @required this.title, @required this.builder, @required this.animated})
: super(settings: RouteSettings(name: name));
final String title;
final WidgetBuilder builder;
final bool animated;
@override
Color get barrierColor => null;
@override
String get barrierLabel => null;
@override
bool get maintainState => true;
@override
Duration get transitionDuration => Duration(milliseconds: 200);
@override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return animated
? FadeTransition(
opacity: animation,
child: Title(
title: this.title,
color: Theme.of(context).primaryColor,
child: builder(context),
),
)
: Title(
title: this.title,
color: Theme.of(context).primaryColor,
child: builder(context),
);
}
}
_
したがって、最後に...画面の1つを簡単に開きたい場合は、次のようにします。
_class HomeScreen extends StatefulWidget {
static Route<dynamic> route(bool animated) {
return SimpleRoute(name: '/', title: 'Home', builder: (_) => HomeScreen(), animated: animated);
}
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
...
}
_
routeCode
は次のようになります:
_static Route<dynamic> routeCode(String id) {
return SimpleRoute(name: '/user/$id', title: 'User', builder: (_) => UserScreen(id: id), animated: false);
}
_
これを行う主な利点は、最後の画面にアクセスして生成されるページのスタックを回避することです。
たとえば、「www.mywebsite.com/user/userId/edit」のonGenerateRoute
を直接使用している場合、Flutterが開きます。
ただし、この方法では、「編集画面」のみが開きます。
@Mariano Zorrillaから上記の方法を試しましたが、ページは順番に開かれました。
/
/user
/user/yFbOfUAwx1OCC93INK8O7VqgBXq2
私は Fluro を見つけ、効率的かつクリーンに機能します。ルーティングするすべてのページを編集するのではなく、1つのルーティングファイルを追加してすべてのルーティングを1つのファイルで実行するだけです。これを実装する方法を次に示します。 :
main.Dart
void main() {
FluroRouter.setupRouter();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Website Title',
onGenerateRoute: FluroRouter.router.generator
);
}
}
fluro_router.Dart
class FluroRouter {
static Router router = Router();
//Define your routers here
static void setupRouter() {
router.define('/', handler: _homeHandler);
router.define('/login', handler: _loginHandler);
router.define('/online-enquiry/:id', handler: _userHandler);
}
//Add your handlers here
static Handler _homeHandler = Handler(handlerFunc: (context, Map<String, dynamic> params) => Home());
static Handler _loginHandler = Handler(handlerFunc: (context, Map<String, dynamic> params) => Login());
static Handler _userHandler = Handler(handlerFunc: (context, Map<String, dynamic> params) => UserProfile(userID: params['userId'].first));
}