// Copyright 2020 The Flutter team. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_lorem/flutter_lorem.dart'; import 'utils.dart'; import 'widgets.dart'; class NewsTab extends StatefulWidget { static const title = 'News'; static const androidIcon = Icon(Icons.library_books); static const iosIcon = Icon(CupertinoIcons.news); const NewsTab({Key? key}) : super(key: key); @override _NewsTabState createState() => _NewsTabState(); } class _NewsTabState extends State { static const _itemsLength = 20; late final List colors; late final List titles; late final List contents; @override void initState() { colors = getRandomColors(_itemsLength); titles = List.generate(_itemsLength, (index) => generateRandomHeadline()); contents = List.generate(_itemsLength, (index) => lorem(paragraphs: 1, words: 24)); super.initState(); } Widget _listBuilder(BuildContext context, int index) { return SafeArea( top: false, bottom: false, child: Card( elevation: 1.5, margin: const EdgeInsets.fromLTRB(6, 12, 6, 0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(4), ), child: InkWell( // Make it splash on Android. It would happen automatically if this // was a real card but this is just a demo. Skip the splash on iOS. onTap: defaultTargetPlatform == TargetPlatform.iOS ? null : () {}, child: Padding( padding: const EdgeInsets.all(12.0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ CircleAvatar( backgroundColor: colors[index], child: Text( titles[index].substring(0, 1), style: const TextStyle(color: Colors.white), ), ), const Padding(padding: EdgeInsets.only(left: 16)), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( titles[index], style: const TextStyle( fontSize: 15, fontWeight: FontWeight.w500, ), ), const Padding(padding: EdgeInsets.only(top: 8)), Text( contents[index], ), ], ), ), ], ), ), ), ), ); } // =========================================================================== // Non-shared code below because this tab uses different scaffolds. // =========================================================================== Widget _buildAndroid(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text(NewsTab.title), ), body: ListView.builder( itemCount: _itemsLength, itemBuilder: _listBuilder, ), ); } Widget _buildIos(BuildContext context) { return CupertinoPageScaffold( navigationBar: const CupertinoNavigationBar(), child: ListView.builder( itemCount: _itemsLength, itemBuilder: _listBuilder, ), ); } @override Widget build(context) { return PlatformWidget( androidBuilder: _buildAndroid, iosBuilder: _buildIos, ); } }