繁体   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