snapshot of https://github.com/flutter/samples.git (main, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Main Branch CI / Test Flutter beta on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter stable on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter beta on macos-latest (push) Has been cancelled
Main Branch CI / Test Flutter stable on macos-latest (push) Has been cancelled
Some checks failed
Main Branch CI / Test Flutter beta on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter stable on ubuntu-latest (push) Has been skipped
Main Branch CI / Test Flutter beta on macos-latest (push) Has been cancelled
Main Branch CI / Test Flutter stable on macos-latest (push) Has been cancelled
This commit is contained in:
127
platform_design/lib/news_tab.dart
Normal file
127
platform_design/lib/news_tab.dart
Normal file
@@ -0,0 +1,127 @@
|
||||
// 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({super.key});
|
||||
|
||||
@override
|
||||
State<NewsTab> createState() => _NewsTabState();
|
||||
}
|
||||
|
||||
class _NewsTabState extends State<NewsTab> {
|
||||
static const _itemsLength = 20;
|
||||
|
||||
late final List<Color> colors;
|
||||
late final List<String> titles;
|
||||
late final List<String> 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user