簡體   English   中英

如何創建通用 Dart 庫?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM