[英]How can I create a generic Dart Library?
我有 2 个需要身份验证的应用程序,我正在尝试创建一个“可重用”身份验证库。
app1.dart
import 'package:myLibrary/login_page.dart';
class App1 extends StatefulWidget {
@override
_App1State createState() => _App1State();
}
class _App1State extends State<App1> {
bool authenticated = false;
@override
Widget build(BuildContext context) {
if (authenticated) {
return Scaffold(...);
} else {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => return LoginPage()));
}
}
}
app2.dart(几乎相同的结构)
import 'package:myLibrary/login_page.dart';
class App2 extends StatefulWidget {
@override
_App2State createState() => _App2State();
}
class _App2State extends State<App2> {
bool authenticated = false;
@override
Widget build(BuildContext context) {
if (authenticated) {
return Scaffold(...);
} else {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => return LoginPage()));
}
}
}
我的图书馆/login_page.dart
class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _auth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Autentication'),
),
),
body: SafeArea(
...
if (userCredential != null) {
setState(() {
_isLoading = false;
});
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => AnyApp()), <--- PROBLEM Here!
);
} else {
//Show login failed
}
问题是AnyApp()需要映射到调用库的 class。
据我从类似问题中收集到的信息,不允许传递 Class。
那么这是可行的吗?
这就是我实施@Levi Lesches 的建议的方式,它解决了这个问题。
主要.dart
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:myApp/home_page/home_page.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// Create route to supply to generic Login package
MaterialPageRoute materialPageRoute = MaterialPageRoute(builder: (context) => HomePage());
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: themeECL,
// Pass specific Route to generic LoginPage
home: LoginPage(materialPageRoute: materialPageRoute),
);
}
}
我的图书馆/login_page.dart
class LoginPage extends StatefulWidget {
//Add argument to pass Route on successful login
const LoginPage({
Key? key,
required this.materialPageRoute,
}) : super(key: key);
final MaterialPageRoute materialPageRoute;
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _auth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Autentication'),
),
),
body: SafeArea(
...
if (userCredential != null) {
setState(() {
_isLoading = false;
});
Navigator.pushReplacement(
context,
widget.materialPageRoute <--- Solution Here!
);
} else {
//Show login failed
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.