Flutter Web 持久标头

Posted

技术标签:

【中文标题】Flutter Web 持久标头【英文标题】:Flutter Web persistent header 【发布时间】:2019-10-29 10:36:09 【问题描述】:

随着 web 的 Flutter 的引入,我试图实现一个网站样式的标题,该标题在使用路由时和整个应用程序中都是持久的。 Appbar 似乎不是解决方案,因为每个脚手架都有自己的 appBar。我用MaterialApp 创建了Column 中的标题小部件。但是,这种实现感觉是错误的,因为一切都应该是 MaterialApp 或 CupertinoApp 的孩子。

如果 searchBar 标头可以放置在 MaterialApp 中,并且我能够使用 Navigator,那将是首选。我真的在这里寻求指导和“正确”的方法。

void main() 
  initKiwi();
//  BlocSupervisor().delegate = AppBlocDelegate();
  runApp(MyApp());


class MyApp extends StatelessWidget 

  @override
  Widget build(BuildContext context) 
    return Column(children: <Widget>[
      Material(
        elevation: 2.0,
        color: Colors.white,
        child: MediaQuery(
          data: MediaQueryData.fromWindow(ui.window),
          child: Directionality(
            textDirection: TextDirection.ltr,
            child: Container(
              height: 50,
              child: SearchBar(),
            ),
          ),
        ),
      ),
      Expanded(
        child: MaterialApp(
          title: 'Discover Brindle',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            fontFamily: 'Brdl',
          ),
          home: Text("Pages & Routes Here"),
        ),
      ),
    ]);
  


【问题讨论】:

【参考方案1】:

虽然它没有使用路由,但我可以使用IndexedStack 解决这个问题。这也保留了我在关闭搜索页面时在ProductsPage() 中所做的任何滚动。 AppBar 是持久的,并且能够将代码保持在最低限度。

main.dart

class MyApp extends StatelessWidget 
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Discover Brindle',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        fontFamily: 'Brdl'
      ),
      home: MainPage(),
    );
  


main_page.dart

class MainPage extends StatefulWidget 
  @override
  _MainPageState createState() => _MainPageState();


class _MainPageState extends State<MainPage> 
  final _searchBloc = kiwi.Container().resolve<SearchBloc>();
  final _productsBloc = kiwi.Container().resolve<ProductsBloc>();
  PageController pageController;
  int currentPage = 0;

  void _onSearchActive(bool isActive) 
    setState(() 
      this.currentPage = isActive ? 1 : 0;
    );
  

  @override
  Widget build(BuildContext context) 
    return GestureDetector(
      onTap: () 
        FocusScope.of(context).requestFocus(new FocusNode());
      ,
      child: _buildScaffold(),
    );
  

  Widget _buildScaffold() 
    return BlocProviderTree(
      blocProviders: [
        BlocProvider<SearchBloc>(bloc: _searchBloc),
        BlocProvider<ProductsBloc>(bloc: _productsBloc),
      ],
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.white,
          title: SearchBar(onIsActive: _onSearchActive),
        ),
        body: IndexedStack(
          children: [
            ProductsPage(),
            SearchPage(),
          ],
          index: currentPage,
        ),
      ),
    );
  

【讨论】:

以上是关于Flutter Web 持久标头的主要内容,如果未能解决你的问题,请参考以下文章

How To - 带有持久子屏幕的 Flutter Drawer

使用 Ferry 和 Flutter 向请求添加标头

格式化 datePicker 标头 - Flutter

在flutter web上缓存图像,是不是需要?

如何将新标头添加到 Flutter 插件 iOS 项目?

Flutter:在框架模块“firebase_core.FLTFirebasePlugin”中包含非模块化标头