flutter / website

Flutter documentation web site
https://docs.flutter.dev
Other
2.79k stars 3.2k forks source link

Update some of Dart sample code on Flutter for Xamarin.Forms developers page #8920

Open Paul-N opened 1 year ago

Paul-N commented 1 year ago

Page URL

https://docs.flutter.dev/get-started/flutter-for/xamarin-forms-devs/

Page source

https://github.com/flutter/website/tree/main/src/get-started/flutter-for/xamarin-forms-devs.md

Describe the problem

Sources of samples with json http requests are incorrect

Expected fix

For https://docs.flutter.dev/get-started/flutter-for/xamarin-forms-devs#what-is-the-equivalent-of-devicebeginonmainthread-in-flutter

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(const SampleApp());
}

class SampleApp extends StatelessWidget {
  const SampleApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Sample App',
      home: SampleAppPage(),
    );
  }
}

class SampleAppPage extends StatefulWidget {
  const SampleAppPage({super.key});

  @override
  State<SampleAppPage> createState() => _SampleAppPageState();
}

class _SampleAppPageState extends State<SampleAppPage> {
  List<dynamic> data = <dynamic>[];

  @override
  void initState() {
    super.initState();
    loadData();
  }

  Future<void> loadData() async {
    final Uri dataURL = Uri.parse(
      'https://jsonplaceholder.typicode.com/posts',
    );
    final http.Response response = await http.get(dataURL);
    setState(() {
      data = jsonDecode(response.body);
    });
  }

  Widget getRow(int index) {
    return Padding(
      padding: const EdgeInsets.all(10),
      child: Text('Row ${data[index]['title']}'),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Sample App')),
      body: ListView.builder(
        itemCount: data.length,
        itemBuilder: (context, index) {
          return getRow(index);
        },
      ),
    );
  }
}

For https://docs.flutter.dev/get-started/flutter-for/xamarin-forms-devs#how-do-i-show-the-progress-for-a-long-running-task

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(const SampleApp());
}

class SampleApp extends StatelessWidget {
  const SampleApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Sample App',
      home: SampleAppPage(),
    );
  }
}

class SampleAppPage extends StatefulWidget {
  const SampleAppPage({super.key});

  @override
  State<SampleAppPage> createState() => _SampleAppPageState();
}

class _SampleAppPageState extends State<SampleAppPage> {
  List<dynamic> data = <dynamic>[];

  @override
  void initState() {
    super.initState();
    loadData();
  }

  bool get showLoadingDialog => data.isEmpty;

  Future<void> loadData() async {
    final Uri dataURL = Uri.parse(
      'https://jsonplaceholder.typicode.com/posts',
    );
    final http.Response response = await http.get(dataURL);
    setState(() {
      data = jsonDecode(response.body);
    });
  }

  Widget getBody() {
    if (showLoadingDialog) {
      return getProgressDialog();
    }
    return getListView();
  }

  Widget getProgressDialog() {
    return const Center(child: CircularProgressIndicator());
  }

  ListView getListView() {
    return ListView.builder(
      itemCount: data.length,
      itemBuilder: (context, index) {
        return getRow(index);
      },
    );
  }

  Widget getRow(int index) {
    return Padding(
      padding: const EdgeInsets.all(10),
      child: Text('Row ${data[index]['title']}'),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Sample App')),
      body: getBody(),
    );
  }
}

Additional context

Check also complete sources of https://docs.flutter.dev/get-started/flutter-for/xamarin-forms-devs#what-is-the-equivalent-of-devicebeginonmainthread-in-flutter section. I don't have fix for this yet.

huycozy commented 1 year ago

Thanks for your report, @Paul-N

I can see there is an exception with current sample code on website.

E/flutter (26290): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>'
E/flutter (26290): #0      _SampleAppPageState.loadData.<anonymous closure> (package:reproduce_issues/website_8920.dart:44:7)
E/flutter (26290): #1      State.setState (package:flutter/src/widgets/framework.dart:1139:30)
E/flutter (26290): #2      _SampleAppPageState.loadData (package:reproduce_issues/website_8920.dart:43:5)
E/flutter (26290): <asynchronous suspension>
E/flutter (26290): 
huycozy commented 1 year ago

@atsansone I update issue title based on OP's additional fix from https://github.com/flutter/website/issues/8921 (He already updated issue description in this issue as well). Hope it is an appropriate one :)