[英]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.